Compose-3010:OMLでのASCIIファイルの読み取りと書き込み

Tutorial Level: Intermediate

このチュートリアルでは、以下の操作方法について説明します:
  • ASCIIファイルの内容を読み取る。
  • ASCIIファイルにデータを書き込む。

ASCIIファイルの読み取り

Compose OMLには、ASCIIファイルを読み取る方法がいくつか用意されています。ファイル全体の一括読み取り、行単位での読み取り、データフィールドの書式を指定した読み取りが可能です。目的に最も適した方法を選択できます。このチュートリアルでは、次に示す方法による読み取りを紹介します。

  1. ASCIIファイル全体を一度に読み取ります。

    type関数を使用して、指定したファイルの内容を表示できます。次の例に示すように、ファイルを開く操作や閉じる操作は不要です。

    content = type('read1.txt');
    disp(content{1,1})

    <install>/tutorials/read1.txtがあります。

    EditorまたはOMLコマンドウィンドウで、このスクリプトを実行します。

    この方法で、ASCIIファイルの内容を簡単に確認できます。

  2. 行単位で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 windowfopen('/Path/to/File')を使用します。

    fid = fopen('read1.txt','rt');

    これにより、後で参照可能な変数fidにファイルIDが割り当てられます。fopenの2番目の入力は、使用するオプションを指定します。この例では、読み取りに対してrtを使用しています。これは、ファイルをテキストモードで読み取ることを指定します。 fgetl(fid) 関数によって、ファイルfidに記述されているすべての内容が返されます。 feof(fid)を使用して、fidがファイルの最後に達したかどうかを判断します。

    他のテストを使用して、ファイルの読み取りを停止することもできます。詳細については、チュートリアルCompose-3015をご参照ください。

  3. 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つの列と可能な数の行で構成される行列を照合します。

  4. 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行のヘッダー)の読み取りをスキップしています。

ファイルへの書き込み

注: Composeが制限のあるディレクトリにインストールされている場合、書き込みの実行はできません。ユーザーディレクトリまたは書き込み権のあるディレクトリでこのチュートリアルを実行してください。
  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ファイルではなく、バイナリファイルで書き込まれます。

  2. 行列を保存します。

    このチュートリアルでは、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ファイルに保存した行列では、その値の精度が低下します。バイナリファイルに保存するか、OMLSave/Load関数を使用することをお勧めします。