为什么fread总是返回0?

我用这段代码来读取文件。 但是freadfunction总是返回0.我的错误是什么?

FILE *file = fopen(pathToSourceFile, "rb"); if(file!=NULL) { char aByte[50000]; int ret = fread(aByte, sizeof(aByte), 1, file); if(ret != 0) { not jump into there; fseek(file, 0, SEEK_SET); fwrite(aByte, ret, 1, file); } } fclose(file); 

你确定你的文件大小超过50000吗? 否则你可以尝试:

  fread(aByte,1, sizeof(aByte), file); 

ferror()会告诉我什么时候出错。

您可以使用perror()打印实际的错误消息。

您无法在rb模式下打开文件。

你的ret始终为零的陈述是错误的。 如果您已正确检测了代码,则不会做出错误的声明:

 #include  #include  int main() { FILE *file = fopen("junk.dat", "rb"); if(file!=NULL) { char aByte[50000]; int ret = fread(aByte, sizeof(aByte), 1, file); fprintf(stderr, "fread returned %d\n", ret); if(ret != 0) { int fs = fseek(file, 0, SEEK_SET); if(fs == -1) { perror("fseek"); exit(1); } fs = fwrite(aByte, ret, 1, file); if(fs != ret) { perror("fwrite"); exit(1); } } } fclose(file); return 0; } 

产量:

 fread returned 1 fwrite: Bad file descriptor 

什么时候跑。

万一有人碰到这个。 我刚遇到类似的问题。 这是因为fread的第二个参数应该是缓冲区每个元素的大小。 在OP的代码中,它是指向缓冲区的指针的大小。

这应该工作,因为buff至少有1个元素:

 int ret = fread(aByte, sizeof(aByte[0]), 1, file); 

你是否:

#include

如果没有,并且如果你在没有-Wall的情况下进行编译,那么C编译器可能错误地认为fread()的第二个参数是一个int而不是一个off_t,这会搞乱函数调用。 您的代码段不显示任何#include语句,因此请确保包含您正在使用的所有内容。