金子邦彦研究室プログラミングOctave のまとめOctave でのテキストファイル入出力とユーザ I/O

Octave でのテキストファイル入出力とユーザ I/O

Octave でのテキストファイル入出力とユーザ I/O の例

※ ユーザ I/O 機能,C スタイルの入出力機能,io パッケージの機能は,他にもいろいろあります.

文字列 (String)について, Octave の info (doc コマンドで表示される)には,「'は転置の意味でも使うので,"がよい」という記述があり,その流儀に従います.

"

disp

端末への単純出力

(例) disp("message");

[image]

fdisp

ファイル(標準エラー出力)などへの出力

(例) fdisp(stderr, "message");

input

端末からの入力

(例) input("please input x = ");

[image]

yes_or_no

端末からの Yes/No 入力

(例) yes_or_no("Do you proceed ? ");

[image]

menu

端末へのメニュー表示と入力

(例) menu( "Fruits", "apple", "orange", "banana" );

[image]

kbhit

キーボードからの入力

(例) kbhit();

fopen

ファイルのオープン

(例) [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);

[image]

fclose

ファイルのクローズ

(例) fclose( fid );

fprintf

書式付き書き込み

引数が行列 (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);

[image]

[image]

fgetl

行単位でのファイル読み出し.

(例)line = fgetl( fid );

この例では,改行文字 (newline) あるいは EOF に達するまで読み込む. 改行文字を取り除いて,line にセットする.

sscanf

文字列のスキャン

(例)[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);

[image]

feof

ファイルの終わり

(例)ファイルを行単位で読み込んで,端末に表示する

※ この例では,ファイルの終わりに達するまで,行単位でのファイル読み出しを行う.

[fid, msg] = fopen("C:\\hoge.txt", "r");
while( ! feof(fid) )
    line = fgetl(fid);
    disp(line);
endwhile
fclose(fid)

[image]

dlmread

行列やベクトルのファイルからの読み出し.数字が並んだデータなら,簡単に読み出せる.

(例)区切り文字は「,」.1行目から読む(0行目は読み飛ばす).0列目から読む(列の読み飛ばしは無い)

  pkg load io;
  A = dlmread( "C:\\hoge.txt", ",", 1, 0 )

[image]

[image]

dlmwrite

行列やベクトルのファイルへの書き込み

(例)行ベクトルの書き込み.区切りは「, 」で,行列の各行の末尾は「\n」

  pkg load io;
  v = randn(1,10)
  dlmwrite( "C:\\hoge.txt", v, "delimiter", ", ", "newline", "\n" )

[image]

[image]

(例)行列の書き込み.区切りは「, 」で,行列の各行の末尾は「\n」

  pkg load io;
  A = reshape(1:12, 3, 4)
  dlmwrite( "C:\\hoge.txt", A, "delimiter", ", ", "newline", "\n" )

[image]

[image]