C语言 为什么fread总是返回0?

guicsvcw  于 2023-02-07  发布在  其他
关注(0)|答案(8)|浏览(345)

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

mznpcxlj1#

你确信你的文件有一个大小大于50000?否则你可以尝试:

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

omqzjyyz2#

ferror()会在出现问题时发出警报。
您可以使用perror()打印实际的错误消息。

vd2z7a6w

vd2z7a6w3#

不能对以rb模式打开的文件执行fwrite操作。
你说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

运行时。

nbewdwxp

nbewdwxp4#

在我的例子中,我想读取一个大小为6553600字节的文件(一个mp3),它返回0字节读取,这让我发疯,直到,我试图手动硬编码30字节,它确实读取了30字节。
我开始研究它,看看它能读多少,结果是它能读262144(2^18)字节,如果你让它读262145字节,它读0。
结论:至少使用这个函数你不能一次加载整个文件。

exdqitrt

exdqitrt5#

以防其他人遇到这个问题。我刚刚遇到了一个类似的问题。这是因为fread的第二个参数应该是缓冲区中**每个元素的大小。在OP的代码中,它是指向缓冲区的指针的大小。
如果buff至少有1个元素,这应该可以工作:

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

vdzxcuhz6#

请检查人的自由度
man fread(3)

size_t fread(void *restrict ptr, size_t size, size_t nmemb, FILE *restrict stream);

返回值
成功时,fread()和fwrite()返回读取或写入的项目数。只有当size为1**时,这个数字才等于传输的字节数。如果发生错误,或者到达文件末尾,则返回一个短项目计数(或零)。
由于您的文件小于50000Bytes(即项目大小),因此读取项目计数为0。

cgyqldqp

cgyqldqp7#

就我而言,

fseek(rFile, 0, SEEK_END);
    iTotalSize = ftell(rFile);
    fseek(rFile, 0, SEEK_SET);   // <-- I wrote SEEK_END, not SEEK_SET

因此它读取0字节(任何内容)

rnmwe5a2

rnmwe5a28#

您是否:
#include <unistd.h>
如果没有,并且没有使用-Wall,C编译器可能会错误地认为fread()的第二个参数是int而不是off_t,这可能会扰乱函数调用。您的代码片段没有显示任何#include语句,因此请确保包含了您正在使用的所有语句。

相关问题