C言語読み書きファイルとバイナリファイル
1569 ワード
読み書きファイルには「w」と「wb」の形式があり、それぞれテキスト形式で読み書きし、バイナリ形式で読み書きする.これは日常的に数字と文字を読み書きするのに違いはありませんが、2つの場所が違います.
1、テキスト方式の読み取りは、車を戻し、改行する2文字を1文字にし、ファイルを短くしたことに相当します.今のところ、このような特別な点はまだ発見されていません.
2、テキスト形式とバイナリ形式で適用される終了子と読み書き関数が異なります.特に終了符の問題は、困っています.
C標準関数ライブラリでは、EOF(stdio.h)で定義された#define EOF(-1))は、ファイル終端記号(end of file)を表します.一般的にwhileループでは、EOFをファイル終端フラグとして使用します.たとえば、次のようになります.
このEOFをファイル終了フラグとするファイルは、テキストファイルでなければなりません.テキストファイルでは、データはすべて文字のASCIIコード値として格納されます.ASCIIコード範囲0-127、(1バイト8ビットで256を表すことができ、1バイトのcharでは-128~127、unsigned charでは0-255).全1、すなわち11111111を用いる(符号化形式)は-1を表し、-1でテキストの終端EOFを表します.例えばgetc関数は1バイト1バイトで読み、1バイト11111111まで読むと、テキストが終了し、停止したと考えられます.ASCIIで格納されているテキストについては、何の問題もありません.テキストに見える文字は、すべて00000000-01111111の間にあるからです.
ただし、ファイルにデータをバイナリ形式で格納すると、必ず-1があります.例えば私はハフマン符号化をして、テキストを01コードに変えて、charタイプの「0」と「1」すなわちASCIIコードの48,49で直接記憶することはできないので、圧縮を行って、1バイトで8つの01コードを記憶することができます.このとき、私のテキストには8つの1が連続して現れる可能性があります.したがって、EOFはバイナリファイルの終了フラグとして使用できません.この問題を解決するためには,feof関数を用いてファイルが終了するか否かを判断しなければならない.ファイルの終了に遭遇した場合、関数feof(fp)の値は1であり、そうでなければ0であり、feofはファイル内のコンテンツに干渉されず、追加の終了文字を追加することに相当する.
Feof関数は、バイナリファイルが終了したかどうかを判断するためにも、テキストファイルが終了したかどうかを判断するためにも使用できます.ただしfeofでテキストファイルの末尾を判断する場合、コードの記述が不適切であれば、テキスト文中のファイル終端子EOFも読み込まれる可能性がありますので注意が必要です(まだ遭遇していません).
http://www.cnblogs.com/cy568searchx/archive/2012/10/18/2728894.html中はよく書けていて、はっきりしています.あといくつかは細かく書かない.もっと勉強しなさい.
1、テキスト方式の読み取りは、車を戻し、改行する2文字を1文字にし、ファイルを短くしたことに相当します.今のところ、このような特別な点はまだ発見されていません.
2、テキスト形式とバイナリ形式で適用される終了子と読み書き関数が異なります.特に終了符の問題は、困っています.
C標準関数ライブラリでは、EOF(stdio.h)で定義された#define EOF(-1))は、ファイル終端記号(end of file)を表します.一般的にwhileループでは、EOFをファイル終端フラグとして使用します.たとえば、次のようになります.
char chtemp;
FILE *fp;
if (NULL == (fp = fopen("1.txt", "r")))
{
printf("error
");
exit(1);
}
while (EOF != (chtemp = fgetc(fp)))
{ }
このEOFをファイル終了フラグとするファイルは、テキストファイルでなければなりません.テキストファイルでは、データはすべて文字のASCIIコード値として格納されます.ASCIIコード範囲0-127、(1バイト8ビットで256を表すことができ、1バイトのcharでは-128~127、unsigned charでは0-255).全1、すなわち11111111を用いる(符号化形式)は-1を表し、-1でテキストの終端EOFを表します.例えばgetc関数は1バイト1バイトで読み、1バイト11111111まで読むと、テキストが終了し、停止したと考えられます.ASCIIで格納されているテキストについては、何の問題もありません.テキストに見える文字は、すべて00000000-01111111の間にあるからです.
ただし、ファイルにデータをバイナリ形式で格納すると、必ず-1があります.例えば私はハフマン符号化をして、テキストを01コードに変えて、charタイプの「0」と「1」すなわちASCIIコードの48,49で直接記憶することはできないので、圧縮を行って、1バイトで8つの01コードを記憶することができます.このとき、私のテキストには8つの1が連続して現れる可能性があります.したがって、EOFはバイナリファイルの終了フラグとして使用できません.この問題を解決するためには,feof関数を用いてファイルが終了するか否かを判断しなければならない.ファイルの終了に遭遇した場合、関数feof(fp)の値は1であり、そうでなければ0であり、feofはファイル内のコンテンツに干渉されず、追加の終了文字を追加することに相当する.
Feof関数は、バイナリファイルが終了したかどうかを判断するためにも、テキストファイルが終了したかどうかを判断するためにも使用できます.ただしfeofでテキストファイルの末尾を判断する場合、コードの記述が不適切であれば、テキスト文中のファイル終端子EOFも読み込まれる可能性がありますので注意が必要です(まだ遭遇していません).
http://www.cnblogs.com/cy568searchx/archive/2012/10/18/2728894.html中はよく書けていて、はっきりしています.あといくつかは細かく書かない.もっと勉強しなさい.