ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

テキスト ファイルへの書き込み

矩形配列の区切り文字付き ASCII ファイル (CSV ファイルなど) を数値配列から作成するには、dlmwrite などの高水準関数を使用します。詳細は、「区切り文字付きデータ ファイルへの書き込み」を参照してください。

数値と文字の混成データ、非矩形出力ファイル、非 ASCII コード ファイルなど、他のテキスト ファイルを作成するには、低水準の関数 fprintf を使用します。詳細は、次の各節を参照してください。

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

ファイルを開く

あらゆる低水準 I/O 関数で行うように、エクスポートの前に fopen でファイルを開くかまたは作成し、ファイル識別子を取得します。既定の設定により、fopen ではファイルが読み取り専用で開かれるため、'w' または 'a' のように、書き込みまたは追加のアクセス許可を指定しなければなりません。

ファイルの処理が終了したら、fclose(fid) を使用してこれを閉じます。

出力の記述

fprintf では配列を入力として受け入れ、その配列内の数字や文字を指定に従ってテキストに変換します。

たとえば、浮動小数点数を表示するには '%f' を指定します。他の一般的な変換指定子には、整数の '%d' や文字列の '%s' などがあります。変換指定子の一覧は、fprintf のリファレンス ページを参照してください。

ファイル内で新しい行に移動するには、'\n' を使用します。

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

fprintf では、変換情報が入力配列のすべての値に列順に繰り返し適用されます。

たとえば、指数関数の短い表とテキスト ヘッダーを含む exptable.txt という名前のファイルを作成します。

% create a matrix y, with two rows
x = 0:0.1:1;
y = [x; exp(x)];

% open a file for writing
fid = fopen('exptable.txt', 'w');

% print a title, followed by a blank line
fprintf(fid, 'Exponential Function\n\n');

% print values in column order
% two values appear on each row of the file
fprintf(fid, '%f  %f\n', y);
fclose(fid);

ファイルを表示するには、関数 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 の呼び出しに追加情報を含めて、フィールドの幅、精度、出力値の順序などを記述します。たとえば、指数関数表におけるフィールドの幅と小数点以下の桁数を指定します。

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

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

fclose(fid);

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

詳細は、『プログラミングの基礎』ドキュメンテーションの「書式付き文字列」、および fprintf のリファレンス ページを参照してください。

既存のファイルに対する追加または上書き

既定の設定では、fopen によってファイルは読み取りアクセス用に開きます。ファイル アクセスのタイプを変更するには、fopen の呼び出しで permission 文字列を使用します。使用可能な permission 文字列には以下のものがあります。

  • 読み取り用の r

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

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

読み取りに加え、書き込みまたは追加用にファイルを開くには、'w+''a+' のようにアクセス許可文字にプラス記号を付けます。アクセス許可文字の値の一覧は、fopen のリファレンス ページを参照してください。

    メモ:   ファイルを読み取りと書き込みの両方のアクセス許可で開いた場合、読み取りと書き込みの操作の間に fseek または frewind を呼び出さなければなりません。

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

次のようにファイル changing.txt を作成します。

myformat = '%5d %5d %5d %5d\n';

fid = fopen('changing.txt','w');
fprintf(fid, myformat, magic(4));
fclose(fid);

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

   16     5     9     4
    2    11     7    14
    3    10     6    15
   13     8    12     1

[55 55 55 55] をファイルの末尾に追加します。

% open the file with permission to append
fid = fopen('changing.txt','a');

% write values at end of file
fprintf(fid, myformat, [55 55 55 55]);

% close the file 
fclose(fid);

ファイルを表示するには、関数 type を呼び出します。

type changing.txt

このコマンドによってファイルの新しい内容が返されます。

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

例 — 既存のテキスト ファイルの上書き

この例では、テキスト ファイルの文字を置き換えする 2 つの方法を示します。

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

たとえば、changing.txt (前の例で作成) の最初の行をより長いわかりやすいテキストに置き換えるとします。変更は最初の行に適用されるため、次のようにファイル全体を書き直します。

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

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

mydata{replaceLine} = newText;

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

ファイルの内容は次のようになります。

 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];

% move the file position marker to the correct line
fid = fopen('changing.txt','r+');
for k=1:(replaceLine-1);
   fgetl(fid);
end

% call fseek between read and write operations
fseek(fid, 0, 'cof');

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

ファイルの内容は次のようになります。

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 を再度呼び出します。

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

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

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

この情報は役に立ちましたか?