Main Content

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

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

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

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

メモ

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

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

この例では、関数 fwrite を使用してバイナリ データのストリームをファイルにエクスポートする方法を説明します。

1 から 9 までの整数で nine.bin という名前のファイルを作成します。あらゆる低水準 I/O 関数で行うように、書き込みの前に fopen でファイルを開くかまたは作成し、ファイル識別子を取得します。

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

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

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

fclose(fileID);

倍精度値をもつファイルを作成します。行列内の値が 8 ビット符号なし整数以外の場合は、値の精度を指定しなければなりません。

mydata = [pi 42 1/3];

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

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

この例では、既存のバイナリ ファイルの一部を上書きし、ファイルに値を追加する方法を説明します。

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

  • 読み取り用の 'r'

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

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

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

既存のファイルの一部の上書き

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

fileID = fopen('magic4.bin','w+');
fwrite(fileID,magic(4));

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

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

ファイルには 16 バイトが含まれ、行列のそれぞれの値に 1 バイトが充てられています。

行列の第 2 列の値をベクトル [44 44 44 44] で置き換えます。これを行うには、まず fseek を使用してファイルの最初から 4 番目のバイトを探索します。

fseek(fileID,4,'bof');

fwrite を使用して、ベクトル [44 44 44 44] を書き込みます。

fwrite(fileID,[44 44 44 44]);

結果をファイルから 4 行 4 列の行列に読み取ります。

frewind(fileID);
newdata = fread(fileID,[4,4])
newdata = 4×4

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

ファイルを閉じます。

fclose(fileID);

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

[55 55 55 55]magic4.bin に追加します。まず、追加および読み取りアクセス許可を指定してファイルを開きます。

fileID = fopen('magic4.bin','a+');

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

fwrite(fileID,[55 55 55 55]);

結果をファイルから 4 行 5 列の行列に読み取ります。

frewind(fileID);
appended = fread(fileID, [4,5])
appended = 4×5

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

ファイルを閉じます。

fclose(fileID);

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

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

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

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

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

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

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

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

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

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

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

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

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

複素数の書き込みおよび読み取り

この例では、バイナリ ファイルに対する複素数の書き込みおよび読み取りを行う方法を説明します。

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

  • すべての実数部の後にすべての虚数部を書き込む

  • 各部を交互に配置する

ターゲット アプリケーションでデータが読み取れるような方法を使用してください。

実数部と虚数部の分離

複素数値を含む配列を作成します。

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

   0.8147 + 0.7577i   0.0975 + 0.7060i   0.1576 + 0.8235i   0.1419 + 0.4387i   0.6557 + 0.4898i
   0.9058 + 0.7431i   0.2785 + 0.0318i   0.9706 + 0.6948i   0.4218 + 0.3816i   0.0357 + 0.4456i
   0.1270 + 0.3922i   0.5469 + 0.2769i   0.9572 + 0.3171i   0.9157 + 0.7655i   0.8491 + 0.6463i
   0.9134 + 0.6555i   0.9575 + 0.0462i   0.4854 + 0.9502i   0.7922 + 0.7952i   0.9340 + 0.7094i
   0.6324 + 0.1712i   0.9649 + 0.0971i   0.8003 + 0.0344i   0.9595 + 0.1869i   0.6787 + 0.7547i

複素数値を実数部と虚数部に分離します。

z_real = real(z);
z_imag = imag(z);

すべての実数部の後に虚数部を書き込む

complex_adj.bin という名前のファイルに、すべての実数部 z_real を書き込み、その後に続けてすべての虚数部 z_imag を書き込みます。

adjacent = [z_real z_imag];

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

fread を使用してファイルから値を読み取ります。

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

same_z = complex(same_real, same_imag);

実数部と虚数部の交互配置

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

最初に、交互配置された配列を事前に割り当てます。

interleaved = zeros(nrows*2, ncols);

実数データと虚数データを交互に代入します。

newrow = 1;
for row = 1:nrows
    interleaved(newrow,:) = z_real(row,:);
    interleaved(newrow + 1,:) = z_imag(row,:);
    newrow = newrow + 2;
end

交互配置された値を complex_int.bin という名前のファイルに書き込みます。

fileID = fopen('complex_int.bin','w');
fwrite(fileID, interleaved, 'double');
fclose(fileID);

読み取り用にファイルを開き、そのファイルから実数値を読み取ります。fread の 4 番目の入力は、各値を読み取った後に、指定したバイト数をスキップするよう関数に指示します。

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

ファイル内の最初の虚数値に戻ります。次に、すべての虚数データを読み取ります。

fseek(fileID, 8, 'bof');
same_imag = fread(fileID, [nrows, ncols], 'double', 8);
fclose(fileID);

same_z = complex(same_real, same_imag);

参考

| | |

関連するトピック