c ++奇怪地改变了fgetpos

时间:2009-08-14 17:42:38

标签: 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);

我得到ret = 9和pos = 9.

但是如果我跑

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,但pos = 11!

这怎么可能?

2 个答案:

答案 0 :(得分:8)

您需要以二进制模式打开文件:

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

区别在于通过读取库认为是换行符并扩展它的字符 - 二进制模式阻止扩展。

答案 1 :(得分:1)

这是Windows的事情。在文本模式下,Windows在写入时将'\ n'扩展为'CR''LF',并在读取时将'CR''LF'压缩为'\ n'。文本模式是Windows上的默认模式。正如Neil所提到的,在fopen()的模式字符串中添加“b”会关闭换行符。您不会在* nix系统上进行此翻译。