[英]Why does `fseek(…, 0, SEEK_CUR)` fail on windows?
我测试了以下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;
}
在Win10上使用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
)
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有什么关系吗?
这是记录在MSDN 这里 :
对于在文本模式下打开的流,fseek和_fseeki64的使用受到限制,因为回车换行转换会导致fseek和_fseeki64产生意外结果。 保证在文本模式下打开的流上运行的唯一fseek和_fseeki64操作是:
寻找相对于任何原点值的偏移量为0。
在使用_fseeki64时使用fseekor _ftelli64时,从文件的开头寻找使用fsell调用返回的偏移值。
以二进制模式打开文件...您可以获得更可预测的结果:
FILE * file = fopen("ans.txt", "rb+");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.