我用这段代码读取文件,但是fread函数总是返回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);
8条答案
按热度按时间mznpcxlj1#
你确信你的文件有一个大小大于50000?否则你可以尝试:
omqzjyyz2#
ferror()
会在出现问题时发出警报。您可以使用
perror()
打印实际的错误消息。vd2z7a6w3#
不能对以
rb
模式打开的文件执行fwrite
操作。你说
ret
总是零是错误的。如果你正确地检测了你的代码,你就不会做出错误的声明:产量:
运行时。
nbewdwxp4#
在我的例子中,我想读取一个大小为6553600字节的文件(一个mp3),它返回0字节读取,这让我发疯,直到,我试图手动硬编码30字节,它确实读取了30字节。
我开始研究它,看看它能读多少,结果是它能读262144(2^18)字节,如果你让它读262145字节,它读0。
结论:至少使用这个函数你不能一次加载整个文件。
exdqitrt5#
以防其他人遇到这个问题。我刚刚遇到了一个类似的问题。这是因为fread的第二个参数应该是缓冲区中**每个元素的大小。在OP的代码中,它是指向缓冲区的指针的大小。
如果buff至少有1个元素,这应该可以工作:
vdzxcuhz6#
请检查人的自由度
man fread(3)
返回值
成功时,fread()和fwrite()返回读取或写入的项目数。只有当size为1**时,这个数字才等于传输的字节数。如果发生错误,或者到达文件末尾,则返回一个短项目计数(或零)。
由于您的文件小于50000Bytes(即项目大小),因此读取项目计数为0。
cgyqldqp7#
就我而言,
因此它读取0字节(任何内容)
rnmwe5a28#
您是否:
#include <unistd.h>
如果没有,并且没有使用-Wall,C编译器可能会错误地认为fread()的第二个参数是int而不是off_t,这可能会扰乱函数调用。您的代码片段没有显示任何#include语句,因此请确保包含了您正在使用的所有语句。