6

尝试使用 c fread() 调用从简单的文本文件中读取时,我遇到了一个非常奇怪的错误。
我做了一个非常简单的程序来显示这个错误:

int main(int argc ,char ** argv) {
  FILE* fh = fopen("adult.txt","r");
  if(fh==NULL){
    printf("error opening file\n");
    exit(0);
  }

  int s = 1000;
  printf("cur before=%d\n",ftell(fh));
  char* b = malloc (sizeof(char)*s);
  int k =fread(b,sizeof(char),s,fh);
  printf("cur after reading %d bytes =%d\n",k,ftell(fh));

  return EXIT_SUCCESS;
}

我得到的输出是:

cur before=0
cur after reading 1000 bytes =1007

这正常吗?fread 返回数字“1000”,但光标(使用 ftell())显示 1007,任何帮助将不胜感激。

4

3 回答 3

11

这很正常。

'\n'可以用两个字符表示,所以你得到了歪斜。

如果您不希望这种情况发生,请以二进制模式打开 finaly。

于 2012-05-18T10:43:05.350 回答
6

从以下文档ftell

或二进制流,返回的值对应于从文件开头开始的字节数。对于文本流,不保证该值是从文件开头开始的确切字节数,但返回的值仍可用于使用 fseek 将位置指示器恢复到该位置。

所以是的,这是正常的。

于 2012-05-18T10:45:36.180 回答
1

Let_Me_Be 的答案是正确的。我只是在这里解释“行尾”(EOL)字符取决于底层操作系统。例如,在 Windows 中,如果您使用 'r'(或非二进制)打开文件,那么只要有 '\r\n' 序列,操作系统将仅返回 '\n'。同样,当您写入一个未以二进制模式打开的文件时,在 Windows 中,当您简单地写入 '\n' 时,它将写入 '\r\n'。对于 Unix 系统,操作系统没有完成这样的翻译。经典 Mac 会使用 '\r' 作为行尾字符,但我认为现在他们使用 '\n' 作为 EOL。我希望清除'\n' 的流行语以(可能)由多个字符(\r\n)表示。

于 2012-05-18T11:48:48.057 回答