繁体   English   中英

为什么`fseek(...,0,SEEK_CUR)`在Windows上失败?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM