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

时间:2017-11-13 02:19:25

标签: c windows file stdio line-endings

我测试了以下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有什么关系?

1 个答案:

答案 0 :(得分:3)

MSDN上记录了这一点here

  

对于以文本模式打开的流,fseek和_fseeki64使用有限,   因为回车换行可以导致fseek和   _fseeki64产生意想不到的结果。保证在文本模式下打开的流上运行的唯一fseek和_fseeki64操作是:

     
      
  • 寻找相对于任何原点值的偏移量为0.

  •   
  • 当使用fseekor _ftelli64时,从文件的开头寻找一个从ftell调用返回的偏移值   使用_fseeki64。

  •   

以二进制模式打开文件......您可以获得更可预测的结果:

FILE * file = fopen("ans.txt", "rb+");