Compose-3010:OMLでのASCIIファイルの読み取りと書き込み
Tutorial Level: Intermediate
- ASCIIファイルの内容を読み取る。
- ASCIIファイルにデータを書き込む。
ASCIIファイルの読み取り
Compose OMLには、ASCIIファイルを読み取る方法がいくつか用意されています。ファイル全体の一括読み取り、行単位での読み取り、データフィールドの書式を指定した読み取りが可能です。目的に最も適した方法を選択できます。このチュートリアルでは、次に示す方法による読み取りを紹介します。
-
ASCIIファイル全体を一度に読み取ります。
type関数を使用して、指定したファイルの内容を表示できます。次の例に示すように、ファイルを開く操作や閉じる操作は不要です。
content = type('read1.txt'); disp(content{1,1})
<install>/tutorials/にread1.txtがあります。
EditorまたはOMLコマンドウィンドウで、このスクリプトを実行します。
この方法で、ASCIIファイルの内容を簡単に確認できます。
-
行単位でASCIIファイルを読み取ります。
複数の行が使用されていてファイルサイズが大きく、特定の行または文字列の操作がアプリケーションで要求される場合は、次のようにファイルを行単位で読み取る方法が効率的です。
file = 'read1.txt'; fid = fopen(file,'rt'); counter = 0; % read file line by line while ~feof(fid) counter = counter + 1; line = fgetl(fid); sprintf('line %d in %s: %s',counter,file,line) end fclose(fid);
次の結果が返されます。
この方法でファイルからデータを読み取る場合は、まずそのファイルを開く必要があります。これには、次のようにEditor windowでfopen('/Path/to/File')を使用します。
fid = fopen('read1.txt','rt');
これにより、後で参照可能な変数fidにファイルIDが割り当てられます。fopenの2番目の入力は、使用するオプションを指定します。この例では、読み取りに対してrtを使用しています。これは、ファイルをテキストモードで読み取ることを指定します。 fgetl(fid) 関数によって、ファイルfidに記述されているすべての内容が返されます。 feof(fid)を使用して、fidがファイルの最後に達したかどうかを判断します。
他のテストを使用して、ファイルの読み取りを停止することもできます。詳細については、チュートリアルCompose-3015をご参照ください。
-
fscanfを使用して、書式設定されたフィールドを記述したASCIIファイルを読み取ります。
ASCII形式のデータが特定の書式で保存されていることがあります。このような状況では関数fscanfを使用します。まず、次のようにファイルを作成する必要があります。
fid = fopen('read2.txt','wt'); fprintf(fid,'%4s %8s\n','node','displacement'); for i = 1:100 fprintf(fid,'%4d %8s\n',i,num2str(rand*10)); end fclose(fid);
OMLで作成したread2.txtを開くと、次のような書式による記述になっています。
fscanfを使用して、このファイルを読み取ります。
fid = fopen('read2.txt','rt'); fseek(fid,18); A = fscanf(fid,'%d %f\n',[2 inf]); fclose(fid); disp(A')
このスクリプトをEditor windowで実行します。OMLコマンドウィンドウに実行結果が次のように出力されます。
行列
A'
に保存された結果が、read2.txtの内容と同じであることを確認します。このスクリプトの各部分は次のように機能しています:fseek(fid,18)を使用して、read2.txtの最初の行に移動するようにファイルポインタを更新します。
fscanf(fid,’%d %f\n’,[2 inf])で、書式
‘%d %f\n’
を使用して、2つの列と可能な数の行で構成される行列を照合します。 -
textread関数を使用して、書式設定されたフィールドを記述したASCIIファイルを読み取ります。
次の例に示すように、textreadを使用して、fscanfと同じ処理を実行することもできます。
file = 'read2.txt'; [A,B] = textread(file,'%d %f','headerlines',1); out = [A,B]; disp(out)
この結果は次のようになります。
textread()の2番目の入力引数で書式を指定し、3番目と4番目の入力引数でread2.txtの先頭行(1行のヘッダー)の読み取りをスキップしています。
ファイルへの書き込み
-
簡単な例
fprintfを使用してASCIIファイルに書き込むには、上記同様にファイルを開きますが、次のコードを使用して、読み取りモードではなく、書き込みモードで開きます。
fname = 'read3.txt'; fid = fopen(fname, 'wt'); fprintf(fid, 'Hello World'); fclose(fid);
これにより、
'Hello World'
がファイルread3.txtに出力されます。fopenの2番目の入力引数‘wt’は、テキストファイルモードでの書き込みを指定します。fwriteを使用すると、ASCIIファイルではなく、バイナリファイルで書き込まれます。 -
行列を保存します。
このチュートリアルでは、fscanfを使用して、フィールドを書式設定したASCIIファイルに、特別な書式設定を使用した浮動小数点スカラーを保存する方法を学習しました。ASCIIファイルに行列を保存する方法は次のとおりです。
% write matrix in read4.txt x = [0:0.1:2*pi]; y = [x',sin(x)']; fid = fopen('read4.txt','wt'); fprintf(fid,'%8s %8s\n','X','Y') for i = 1:size(y,1) fprintf(fid,'%f %f\n',y(i,1),y(i,2)); end fclose(fid);
この例は、ASCIIファイルに行列を保存する方法を示しています。このスクリプトの評価後にread4.txtに記述された結果を確認します。
ASCIIファイルに保存した行列では、その値の精度が低下します。バイナリファイルに保存するか、OMLでSave/Load関数を使用することをお勧めします。