2009-08-14 7 views
2

私が実行している場合:C++関数fread変更FGETPOS妙

FILE* pFile = fopen("c:\\08.bin", "r"); 
fpos_t pos; 
char buf[5000]; 

int ret = fread(&buf, 1, 9, pFile); 
fgetpos(pFile, &pos); 

予想通り、私は

FILE* pFile = fopen("c:\\08.bin", "r"); 
fpos_t pos; 
char buf[5000]; 

int ret = fread(&buf, 1, 10, pFile); 
fgetpos(pFile, &pos); 

RET = 10を実行する場合、私は、しかし= 9

RET = 9とPOSを取得し、しかしpos = 11!

これはどのようにすることができますか?

あなたがバイナリモードでファイルを開く必要があり

答えて

8

FILE * pFile = fopen("c:\\08.bin", "rb"); 

違いは、ライブラリは改行し、それを拡大して考えている文字を読み取ることによって、原因となっている - バイナリモードは、拡大を防ぐことができます。

+2

C標準で指摘されているように、「fgetpos()によって格納された値には、fgetpos関数が呼び出すときに ストリームをその位置に再配置するために使用できる不特定の情報が含まれています。 –

+0

私が今まで読んだような標準的な例の罰金としての例! –

1

これはWindowsの問題です。テキストモードでは、Windowsは書き込み時に '\ n'を 'CR' 'LF'に展開し、読み取り時に 'CR' 'LF'を '\ n'に圧縮します。テキストモードは、ウィンドウのデフォルトモードです。 Neilが言及しているように、fopen()のモード文字列に 'b'を追加すると改行が無効になります。 * nixシステムではこの翻訳はありません。