Octave でのテキストファイル入出力とユーザ I/O の例
端末への単純出力,端末からの入力,端末からの Yes/No 入力,端末へのメニュー表示と入力
ファイルのオープン,ファイルのクローズ,書式付き書き込み,行単位でのファイル読み出し.文字列のスキャン,ファイルの終わり
CSV 形式ファイルの読み出しと書き込み
※ ユーザ I/O 機能,C スタイルの入出力機能,io パッケージの機能は,他にもいろいろあります.
文字列 (String)について, Octave の info (doc コマンドで表示される)には,「'は転置の意味でも使うので,"がよい」という記述があり,その流儀に従います.
端末への単純出力
(例) disp("message");
ファイル(標準エラー出力)などへの出力
(例) fdisp(stderr, "message");
端末からの入力
(例) input("please input x = ");
端末からの Yes/No 入力
(例) yes_or_no("Do you proceed ? ");
端末へのメニュー表示と入力
(例) menu( "Fruits", "apple", "orange", "banana" );
キーボードからの入力
(例) kbhit();
ファイルのオープン
(例) [fid, msg] = fopen( "C:\\hoge.txt", "rt" ); ・・・ ファイル「C:\hoge.txt」を,リード用にオープン.
(例) [fid, msg] = fopen( "C:\\hoge.txt", "wt" ); ・・・ ファイル「C:\hoge.txt」を,ライト用にオープン
いずれも,エラー発生時には,msg に,システムエラーメッセージがセットされる.
(例)ファイルのオープンとエラーメッセージ
[fid, msg] = fopen("C:\\hoge.dat", "r"); if ( fid == -1 ) disp( msg ); fclose(fid);
ファイルのクローズ
(例) fclose( fid );
書式付き書き込み
引数が行列 (matrix) のとき, 行列の全要素が出力される. %f 等のフォーマットテンプレート(フォーマットテンプレートは,「%4.2f %8.2f」のように複数書ける)は, 行列に使われたとき, 順番に使用され, 行列の全ての値が表示される.だから,行や列単位で整形されることはない(これはこれで便利).行列の要素数(縦×横)がフォーマットテンプレートの個数の倍数になっていないと,表示が崩れる.
※ 行列を整形して出力したいときは,dlmwrite が便利
(例)fprintf( fid, "%d", v ); ・・・ 整数を,10進形式で表示 (decimal)
(例)fprintf( fid, "%o", v ); ・・・ 整数を,8進形式で表示 (octal)
(例)fprintf( fid, "%x", v ); ・・・ 整数を,16進形式で表示 (hexadecimal)
(例)fprintf( fid, "%x", v ); ・・・ 文字列の引数 v を表示 (decimal)
(例)fprintf( fid, "%f", v ); ・・・ 浮動小数を固定小数点形式で表示
(例)fprintf( fid, "%4.2f %8.2f", v ); ・・・ 浮動小数を固定小数点形式(全体の桁数と小数部の桁数指定.例えば %4.2f なら,全体の桁数が4,小数部の桁数が2)で表示
(例)fprintf( fid, "%e", v ); ・・・ 浮動小数を指数形式で表示 (exponential notation)
(例)行列の書き込み.
M = rand(4,4); [fid, msg] = fopen("C:\\hoge.dat", "w"); fprintf(fid, ", %5.4f", M); fclose(df);
行単位でのファイル読み出し.
(例)line = fgetl( fid );
この例では,改行文字 (newline) あるいは EOF に達するまで読み込む. 改行文字を取り除いて,line にセットする.
文字列のスキャン
(例)[val, count] = sscand(s, template, Inf); ・・・ 文字列 s から「可能な限り多く」読み込んで,列ベクトル(column vector)を返す
(例)テキストファイルの先頭1行読み出し
[fid, msg] = fopen("C:\\hoge.dat", "r"); line = fgetl(fid); [val, count] = sscanf(line, ", %f", Inf);
ファイルの終わり
(例)ファイルを行単位で読み込んで,端末に表示する
※ この例では,ファイルの終わりに達するまで,行単位でのファイル読み出しを行う.
[fid, msg] = fopen("C:\\hoge.txt", "r"); while( ! feof(fid) ) line = fgetl(fid); disp(line); endwhile fclose(fid)
行列やベクトルのファイルからの読み出し.数字が並んだデータなら,簡単に読み出せる.
(例)区切り文字は「,」.1行目から読む(0行目は読み飛ばす).0列目から読む(列の読み飛ばしは無い)
pkg load io; A = dlmread( "C:\\hoge.txt", ",", 1, 0 )
行列やベクトルのファイルへの書き込み
(例)行ベクトルの書き込み.区切りは「, 」で,行列の各行の末尾は「\n」
pkg load io; v = randn(1,10) dlmwrite( "C:\\hoge.txt", v, "delimiter", ", ", "newline", "\n" )
(例)行列の書き込み.区切りは「, 」で,行列の各行の末尾は「\n」
pkg load io; A = reshape(1:12, 3, 4) dlmwrite( "C:\\hoge.txt", A, "delimiter", ", ", "newline", "\n" )