为什么fread总是返回0?

时间:2010-08-29 11:08:00

标签: c file-io

我用这段代码来读取文件。但是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); 

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

您无法fwriterb模式打开文件。

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

#include <stdio.h>
#include <stdlib.h>

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

跑步时。

答案 3 :(得分:0)

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

如果buff至少有1个元素,这应该可行:

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

答案 4 :(得分:0)

就我而言,我想读取一个大小为6553600字节(一个mp3)的文件,并且该文件返回读取的0个字节。这让我发疯,直到我尝试手动对30个字节进行硬编码,但它的确读取了30个字节。

我开始玩它,看看它能读多少,事实证明,如果您要求它读取262145个字节,它可以读取262144个字节(2 ^ 18)字节。

结论:至少使用此功能,您无法一次加载整个文件。

答案 5 :(得分:-1)

你有没有:

#include <unistd.h>

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