C言語関係掲示板

過去ログ

No.227.バイナリーファイルをテキストのように読み込み


No.1383

ps.バイナリ・・についてどうもありがとうございました。
投稿者---haramoto(2002/04/04 00:08:32)


下のものです。
ご回答ありがとうございました。
無事処理をすることができそうです。
ところで、バイナリーファイルの場合、テキストのように一行読み込みそれを書き込み・・・という処理はできないのでしょうか?
バイナリーモードの使い道についてついでにお答えいただければ幸いです。
恐縮ですがお願いします。

No.1386

バイナリファイルの読み書き
投稿者---ともじ(2002/04/05 12:14:53)


こんにちは。

>ところで、バイナリーファイルの場合、テキストのように一行読み込みそれを書き込み・・・という処理はできないのでしょうか?
>バイナリーモードの使い道についてついでにお答えいただければ幸いです。

No.1382の書き込みで用が足りたということですので、Windowsの環境で
ということで進めます。

Windows系のOSでは、テキストファイルの改行は '\r' (0x0d:復帰)
と'\n'(0x0a:改行)の2つの コードで表されます。
そのため、テキストモードで改行コード '\n' をファイルに書き込もうと
すると、 '\r' '\n' の2文字に変換して書き込みます。
逆に読み込みでファイルに '\r' '\n' の改行コードがあれば '\n' の
1文字に変換します。また、テキストファイルの終端にはEOFとして(0x1a)
を付加します。
しかし、バイナリファイルには「0x1a」、「0x0d」、「 0x0a」はデータと
して存在する可能性があり、それをテキストモードのように変換されては
困ってしまいます。そのため、Windows系のC言語ではテキストモードと
バイナリモードを区別します。
なお、UNIX系のC言語ではこれらの区別は不要です。

さて、バイナリモードでの読み書きですが、これは通常、"rb"、"wb"モードで
fopenしたファイルに対してfread()とfwrite()で読み書きします。
それ以外で試したことがなかったのでやってみましたが、
getc()とputc()、fgetc()とfputc()でもできましたが、fgets()とfputs()では
できませんでした。これはfgets()の場合は文字列としての入力を行うために、
読み込んだデータに'\0'を付加してしまうため、データが崩れてしまうためです。


No.1400

Re:バイナリファイルの読み書き
投稿者---かずま(2002/04/06 22:13:04)


> また、テキストファイルの終端にはEOFとして(0x1a)を付加します。

Windows では付加しません。確かめてみてください。


> これはfgets()の場合は文字列としての入力を行うために、読み込んだ
> データに'\0'を付加してしまうため、データが崩れてしまうためです。

たとえば、01 02 00 03 04 0a というバイナリを fgets で読むと、
01 02 00 03 04 0a 00 が配列に書き込まれますが、最後に付加された 00
よりもデータの途中にある 00 のせいで、fputs で出力できないことが問題
なのではありませんか。




No.1406

Re:バイナリファイルの読み書き
投稿者---ともじ(2002/04/08 01:46:35)


>> また、テキストファイルの終端にはEOFとして(0x1a)を付加します。
>
>Windows では付加しません。確かめてみてください。

これは全く私の思い込みだったようです。ご指摘ありがとうございます。
「逆に読み込みでファイルに '\r' '\n' の改行コードがあれば '\n' の
1文字に変換します。また、0x1aのコードをファイルの終端とみなします。
が正しいです。
ちなみに0x1aをファイル終端に付加するのは、(一部の)エディタが行うもの
でした。

>> これはfgets()の場合は文字列としての入力を行うために、読み込んだ
>> データに'\0'を付加してしまうため、データが崩れてしまうためです。
>
>たとえば、01 02 00 03 04 0a というバイナリを fgets で読むと、
>01 02 00 03 04 0a 00 が配列に書き込まれますが、最後に付加された 00
>よりもデータの途中にある 00 のせいで、fputs で出力できないことが問題
>なのではありませんか。

これもご指摘の通りです。
fputsがデータの途中の 00 で出力をやめてしまい、それ以降のデータが
書き込まれないため、fgetsとfputsではうまくいきません。




戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved