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

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

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

低水準 I/O によるバイナリ データのエクスポート

データをエクスポートする低水準関数

"低水準ファイル I/O 関数" では、ファイルの読み取りとファイルへのデータの書き込みをほぼ直接に制御できます。ただし、使いやすい "高水準関数" に比べ、これらの関数ではファイルについて詳細な情報を指定する必要があります。高水準関数とそれらでサポートされるファイル形式の一覧は、「サポートされているファイル形式」を参照してください。

高水準関数でデータをエクスポートできない場合は、以下のいずれかを使用してください。

    メモ:   低水準ファイル I/O 関数は、ANSI® 標準 C ライブラリの関数を基に構成されています。ただし、MATLAB® にはそれらの関数の "ベクトル化" バージョンが含まれており、最小限の制御ループを使用して配列内のデータの読み取りと書き込みが行われます。

ファイルへのバイナリ データの書き込み

バイナリ データのストリームをファイルにエクスポートするには、関数 fwrite を使用します。あらゆる低水準 I/O 関数で行うように、書き込みの前に fopen でファイルを開くかまたは作成し、ファイル識別子を取得します。ファイルの処理が終了したら、fclose を使用してこれを閉じます。

既定の設定により、fwrite では配列からの値を列順に 8 ビットの符号なし整数 (uint8) として書き込みます。

たとえば、1 から 9 までの整数でファイル nine.bin を作成します。

fid = fopen('nine.bin','w');
fwrite(fid, [1:9]);
fclose(fid);

行列内の値が 8 ビット符号なし整数以外の場合は、値の精度を指定します。たとえば、倍精度値をもつファイルを作成するには次のようにします。

mydata = [pi, 42, 1/3];

fid = fopen('double.bin','w');
fwrite(fid, mydata, 'double');
fclose(fid);

精度の記述の一覧は、関数 fwrite のリファレンス ページを参照してください。

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

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

  • 読み取り用の r

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

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

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

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

ファイルを開くと、ファイル内での現在の位置を示すポインターが MATLAB によって作成されます。データの特定部分の読み取りや書き込みを行うには、このポインターをファイル内の任意の位置に動かします。詳細は、「ファイル内での移動」を参照してください。

例 — 既存ファイル内のバイナリ データの上書き

ファイル magic4.bin を、書き込みと読み込みのアクセス許可を指定して次のように作成します。

fid = fopen('changing.bin','w+');
fwrite(fid,magic(4));

元の magic(4) 行列は次のようになります。

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

ファイルには 16 バイトが含まれ、行列のそれぞれの値に 1 バイトが充てられています。4 つの値の 2 番目のセット (行列の第 2 列の値) をベクトル [44 44 44 44] で置き換えます。

% fseek to the fourth byte after the beginning of the file
fseek(fid, 4, 'bof');

%write the four values
fwrite(fid,[44 44 44 44]);

% read the results from the file into a 4-by-4 matrix
frewind(fid);
newdata = fread(fid, [4,4])

% close the file
fclose(fid);

ファイル changing.binnewdata は次のようになります。

    16    44     3    13
     5    44    10     8
     9    44     6    12
     4    44    15     1

例 — 既存ファイルへのバイナリ データの追加

前の例で作成した changing.bin ファイル終端に値 [55 55 55 55] を追加します。

% open the file to append and read
fid = fopen('changing.bin','a+');

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

% read the results from the file into a 4-by-5 matrix
frewind(fid);
appended = fread(fid, [4,5])

% close the file
fclose(fid);

ファイル changing.binappended データは次のようになります。

    16    44     3    13    55
     5    44    10     8    55
     9    44     6    12    55
     4    44    15     1    55

異なるシステムで使用するためのファイルの作成

オペレーティング システムが異なると、バイト レベルまたはビット レベルでの情報の保管も異なっています。

  • "ビッグエンディアン" システムでは、メモリ内の最大のアドレスからバイトを保存します (つまり、ビッグ エンドから保存を開始します)。

  • "リトルエンディアン" システムでは、最小のアドレス (リトル エンド) からバイトを保存します。

Windows® システムではリトル エンディアンのバイト順を、UNIX® システムではビッグ エンディアンのバイト順を使用しています。

逆の "エンディアン" システムで使用するためにファイルを作成するには、ターゲット システムのバイト順を指定します。バイト順は、ファイルを開く呼び出しやファイルを書き込む呼び出しで指定できます。

たとえば、myfile.bin という名前のファイルをリトル エンディアン システム用にビッグ エンディアン システムで作成するには、以下のコマンドのいずれか (または両方) を使用します。

  • 次のコマンドでファイルを開きます。

    fid = fopen('myfile.bin', 'w', 'l')
  • 次のコマンドでファイルを書き込みます。

    fwrite(fid, mydata, precision, 'l')

ここで、'l' はリトルエンディアンの順序を示しています。

どのバイト順がシステムで使用されているかが不明な場合は、関数 computer を呼び出します。

[cinfo, maxsize, ordering] = computer

返される ordering はリトルエンディアン システムでは 'L'、ビッグエンディアン システムでは 'B' となります。

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

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

エンコード スキームによって、char 値の読み取りや書き込みに必要なバイト数が決まります。たとえば、US-ASCII 文字では常に 1 バイトが使用されますが、UTF-8 文字では最大で 4 バイトが使用されます。MATLAB では指定されたエンコード スキームに基づいて、各 char 値に必要なバイト数が自動的に処理されます。ただし、uchar 精度を指定する場合、指定されているエンコードとは無関係に、MATLAB では各バイトを uint8 として処理します。

エンコード スキームを指定しない場合、fopen でファイルが開かれるとシステムの既定のエンコードを使用して処理が行われます。既定の設定が何かを判断するには、ファイルを開き、次の構文で fopen を再度呼び出します。

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

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

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

複素数の書き込みと読み取り

fwrite で利用できる精度の値では、複素数は明示的にはサポートされていません。複素数をファイルに保存するには、実数部と虚数部を分離して別々にファイルに書き込みます。

値を分離した後、すべての実数部の後にすべての虚数部を書き込むか、または各部を交互に配置します。ターゲットのアプリケーションでデータが読み取れるような方法を使用してください。

たとえば、次の複素数の集合について考えます。

nrows = 5;
ncols = 5;
z = complex(rand(nrows, ncols), rand(nrows, ncols));

% Divide into real and imaginary components
z_real = real(z);
z_imag = imag(z);

1 つの方法: すべての実数部を書き込み、その後すべての虚数部を書き込みます。

adjacent = [z_real z_imag];

fid = fopen('complex_adj.bin', 'w');
fwrite(fid, adjacent, 'double');
fclose(fid);

% To read these values back in, so that:
%    same_real = z_real
%    same_imag = z_imag
%    same_z = z

fid = fopen('complex_adj.bin');
same_real = fread(fid, [nrows, ncols], 'double');
same_imag = fread(fid, [nrows, ncols], 'double');
fclose(fid);

same_z = complex(same_real, same_imag);

代替方法: 各値について、実数部と虚数部を交互に書き込みます。fwrite は列順で値を書き込み、実数部と虚数部を交互の行で結合する配列を作成します。

% Preallocate the interleaved array
interleaved = zeros(nrows*2, ncols);

% Alternate real and imaginary data
newrow = 1;
for row = 1:nrows
    interleaved(newrow,:) = z_real(row,:);
    interleaved(newrow + 1,:) = z_imag(row,:);
    newrow = newrow + 2;
end

% Write the interleaved values
fid = fopen('complex_int.bin','w');
fwrite(fid, interleaved, 'double');
fclose(fid);

% To read these values back in, so that:
%    same_real = z_real
%    same_imag = z_imag
%    same_z = z
% Use the skip parameter in fread (double = 8 bytes)

fid = fopen('complex_int.bin');
same_real = fread(fid, [nrows, ncols], 'double', 8);

% Return to the first imaginary value in the file
fseek(fid, 8, 'bof');
same_imag = fread(fid, [nrows, ncols], 'double', 8);
fclose(fid);

same_z = complex(same_real, same_imag);
この情報は役に立ちましたか?