我测试了以下C代码
#include <stdio.h>
int main()
{
FILE * file = fopen("ans.txt", "r+");
printf("%ld", ftell(file)); // prints 0
fgetc(file);
printf("%ld", ftell(file)); // prints -18
printf("%d", fseek(file, 0, SEEK_CUR)); // -1
printf("%ld", ftell(file)); // prints 150
fclose(file);
return 0;
}
使用MinGW-W64(gcc version 7.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
)和Visual Studio 2017(cl.exe版本Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547
)在win10上
ans.txt
文件是(行以unix样式结束)
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
line 11
line 12
line 13
line 14
line 15
line 16
line 17
line 18
line 19
line 20
但是在Arch Linux上或者当我以二进制模式打开文件或将行结束样式更改为“Windows / Mac OS 9”时,一切都是正确的。
与Windows crt有什么关系?
答案 0 :(得分:3)
MSDN上记录了这一点here:
对于以文本模式打开的流,fseek和_fseeki64使用有限, 因为回车换行可以导致fseek和 _fseeki64产生意想不到的结果。保证在文本模式下打开的流上运行的唯一fseek和_fseeki64操作是:
寻找相对于任何原点值的偏移量为0.
当使用fseekor _ftelli64时,从文件的开头寻找一个从ftell调用返回的偏移值 使用_fseeki64。
以二进制模式打开文件......您可以获得更可预测的结果:
FILE * file = fopen("ans.txt", "rb+");