C 为什么ftell()在fread()之后显示错误的位置?
在尝试使用c 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
我制作了一个非常简单的程序来显示该错误:
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
会将行尾(可以是两个字符)解释为一个字符,并将其报告为一个字符。