Main Content

低水準 I/O によるテキスト データ ファイルへのエクスポート

fprintf を使用したテキスト ファイルへの書き込み

この例では、低水準関数 fprintf を使用した、数値と文字の混成データおよび非矩形ファイルなどのテキスト ファイルの作成方法を説明します。

fprintf は、ANSI® 標準 C ライブラリの同名関数を基にしています。ただし、MATLAB® では fprintf のベクトル化バージョンが使用されており、配列のデータが最小限の制御ループで書き込まれます。

ファイルを開く

2 つの行をもつサンプル行列 y を作成します。

x = 0:0.1:1;
y = [x; exp(x)];

fopen を使用して書き込み用にファイルを開き、ファイル識別子 fileID を取得します。既定の設定により、fopen ではファイルが読み取り専用で開かれるため、'w' または 'a' のように、書き込みまたは追加のアクセス許可を指定しなければなりません。

fileID = fopen('exptable.txt','w');

ファイルへの書き込み

関数 fprintf を使用して、タイトルに続けて空行を書き込みます。ファイル内で新しい行に移動するには、'\n' を使用します。

fprintf(fileID, 'Exponential Function\n\n');

メモ: Microsoft® のメモ帳など、一部の Windows® のテキスト エディターでは、'\n' ではなく、'\r\n' の改行文字シーケンスを使用する必要があります。ただし、Microsoft Word やワードパッドでは '\n' で問題なく機能します。

2 つの値がファイル内の各行に表示されるように、y に列順で値を書き込みます。fprintf は、配列入力の数字や文字を指定に従ってテキストに変換します。'%f' を指定して浮動小数点数を出力します。

fprintf(fileID,'%f %f\n',y);

他の一般的な変換指定子には、整数の '%d' や文字の '%s' などがあります。fprintf では、変換情報が入力配列のすべての値に列順に繰り返し適用されます。

書き込みが終了したら、fclose を使用してファイルを閉じます。

fclose(fileID);

関数 type を使用して、ファイルの内容を表示します。

type exptable.txt
Exponential Function

0.000000 1.000000
0.100000 1.105171
0.200000 1.221403
0.300000 1.349859
0.400000 1.491825
0.500000 1.648721
0.600000 1.822119
0.700000 2.013753
0.800000 2.225541
0.900000 2.459603
1.000000 2.718282

他の書式設定オプション

オプションとして、fprintf の呼び出しに追加情報を含めて、フィールドの幅、精度、出力値の順序などを記述します。たとえば、指数関数表におけるフィールドの幅と小数点以下の桁数を指定します。

fileID = fopen('exptable_new.txt', 'w');

fprintf(fileID,'Exponential Function\n\n');
fprintf(fileID,'%6.2f %12.8f\n', y);

fclose(fileID);

ファイルの内容を表示します。

type exptable_new.txt
Exponential Function

  0.00   1.00000000
  0.10   1.10517092
  0.20   1.22140276
  0.30   1.34985881
  0.40   1.49182470
  0.50   1.64872127
  0.60   1.82211880
  0.70   2.01375271
  0.80   2.22554093
  0.90   2.45960311
  1.00   2.71828183

既存のテキスト ファイルへの追加または上書き

この例では、既存のテキスト ファイルへの値の追加、ファイル全体の書き直し、およびファイルの一部のみの上書きを行う方法を説明します。

既定の設定では、fopen によってファイルは読み取りアクセス用に開きます。ファイル アクセスのタイプを変更するには、fopen の呼び出しで許可指定子を使用します。指定できる許可指定子には次のものがあります。

  • 読み取り用の 'r'

  • ファイルの既存の内容を破棄できる、書き込み用の 'w'

  • 既存のファイル終端に追加するための 'a'

読み取りに加え、書き込みまたは追加用にファイルを開くには、'w+''a+' のようにアクセス許可文字にプラス記号を付けます。ファイルを読み取りと書き込みの両方のアクセス許可で開いた場合、読み取りと書き込みの操作の間に fseek または frewind を呼び出さなければなりません。

既存のテキスト ファイルへの追加

changing.txt という名前のファイルを作成します。

fileID = fopen('changing.txt','w');
fmt = '%5d %5d %5d %5d\n';
fprintf(fileID,fmt, magic(4));
fclose(fileID);

changing.txt の現在の内容は以下のとおりです。

16 5 9 4

2 11 7 14

3 10 6 15

13 8 12 1

追加アクセス許可を指定してファイルを開きます。

fileID = fopen('changing.txt','a');

ファイルの最後に値 [55 55 55 55] を書き込みます。

fprintf(fileID,fmt,[55 55 55 55]);

ファイルを閉じます。

fclose(fileID);

関数 type を使用して、ファイルの内容を表示します。

type changing.txt
   16     5     9     4
    2    11     7    14
    3    10     6    15
   13     8    12     1
   55    55    55    55

テキスト ファイル全体の上書き

テキスト ファイルは改行文字を含む連続する文字のセットで構成されています。ファイルの 1 行を異なる数の文字で置き換えるには、ファイル内で変更する行とそれに続くすべての行を書き直さなければなりません。

changing.txt の最初の行をより長い説明的なテキストに置き換えます。変更は最初の行に適用されるため、次のようにファイル全体を書き直します。

replaceLine = 1;
numLines = 5;
newText = 'This file originally contained a magic square';

fileID = fopen('changing.txt','r');
mydata = cell(1, numLines);
for k = 1:numLines
   mydata{k} = fgetl(fileID);
end
fclose(fileID);

mydata{replaceLine} = newText;

fileID = fopen('changing.txt','w');
fprintf(fileID,'%s\n',mydata{:});
fclose(fileID);

ファイルの内容を表示します。

type changing.txt
This file originally contained a magic square
    2    11     7    14
    3    10     6    15
   13     8    12     1
   55    55    55    55

テキスト ファイルの一部の上書き

changing.txt の 3 行目を [33 33 33 33] に置き換えます。テキスト ファイルの一部を厳密に同じ数の文字で置き換える場合は、ファイル内の他の行を書き直す必要はありません。

replaceLine = 3;
myformat = '%5d %5d %5d %5d\n';
newData = [33 33 33 33];

ファイルの位置マーカーを正しい行に移動します。

fileID = fopen('changing.txt','r+');
for k=1:(replaceLine-1);
   fgetl(fileID);
end

読み取りと書き込みの操作の間で fseek を呼び出します。

fseek(fileID,0,'cof');

fprintf(fileID, myformat, newData);
fclose(fileID);

ファイルの内容を表示します。

type changing.txt
This file originally contained a magic square
    2    11     7    14
   33    33    33    33
   13     8    12     1
   55    55    55    55

異なった文字エンコードのファイルを開く

"エンコード スキーム" では、日本語や欧州の言語など、特定の文字体系で必要とされる文字がサポートされています。一般的なエンコード スキームには US-ASCII や UTF-8 などがあります。

読み取るファイルを開くときにエンコード スキームを指定しないと、fopen は自動文字セット検出を使用してエンコードを判定します。書き込むファイルを開くときにエンコード スキームを指定しないと、fopen は既定で UTF-8 を使用します。これは、データの損失または破損を起こすことなく、すべてのプラットフォームとロケール間での相互運用性を提供するためです。

既定の設定が何かを判断するには、ファイルを開き、次の構文で fopen を再度呼び出します。

[filename, permission, machineformat, encoding] = fopen(fid);

ファイルを開く際にエンコードを指定すると、そのスキームは次の関数 fscanffprintffgetlfgetsfread および fwrite で適用されます。

サポートされているエンコード スキームの一覧と、エンコードを指定する構文は、関数 fopen のリファレンス ページを参照してください。

参考

| |

関連するトピック