Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么ftell()在fread()之后显示错误的位置?_C_File_Fread - Fatal编程技术网

C 为什么ftell()在fread()之后显示错误的位置?

C 为什么ftell()在fread()之后显示错误的位置?,c,file,fread,C,File,Fread,在尝试使用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",fte

在尝试使用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,任何帮助都将不胜感激。

这很正常

“\n”
可以用两个字符表示,因此会出现倾斜

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

来自以下文档:

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


所以是的,这是正常的。

让我来吧,我们的答案是正确的。我只是在这里解释,“行结束”(EOL)字符取决于底层操作系统。例如,在Windows中,如果使用“r”(或非二进制)打开文件,则无论何时只要有“\r\n”序列,操作系统都只返回“\n”。同样,当您在未以二进制模式打开的文件中写入时,在Windows中,当您仅写入“\r\n”时,它将写入“\r\n”。对于Unix系统,没有通过操作系统进行这样的转换。经典的Mac会使用'\r'作为行尾字符,但我认为现在他们使用'\n'作为EOL。我希望这会清除“\n”的流行词,使其(可能)由多个字符(\r\n)表示。

谢谢,我不知道这一点。但我不明白为什么fread()的返回值与光标位置不同?@ezzakrem,因为
fread
会将行尾(可以是两个字符)解释为一个字符,并将其报告为一个字符。