首页 文章

是否有使用fread()读取的字节数限制

提问于
浏览
-3

我正在尝试将文件中的数据读入缓冲区 . 文件中的数据为900K字节 . (寻求文件结束和ftell()) . 分配要读取大小为900K 1的数据的缓冲区(以空终止) . 我的问题是fread()返回900K,但是我看到strlen(缓冲区)显示的值较小,而在最后的缓冲区中我可以看到类似“.....(截断)”的内容 . 为什么会这样? fread()是否存在限制,超出该限制我们无法读入缓冲区并且会截断它 . 也就是为什么fread()的返回值表示为900K,尽管它实际上已经读得更少了 .

2 回答

  • 0

    strlen 在这些方面做了些什么:

    int strlen(char *str)
    {
         int len = 0;
         while(*str++) len++;
         return len;
    }
    

    如果您的文件包含二进制数据(或者如果它是具有UTF编码和未使用的高位字节的文本文件) strlen 将在它遇到的第一个 0x00 字节处停止并返回遇到的文件中的字节数 . 如果您使用ANSI等单字节编码读取文本文件,则不会有空终止符,并且调用 strlen 将调用未定义的行为 .

    如果要确定 fread 成功读出文件的字节数,请检查其返回值

    如果要在读取文件之前确定文件大小,请执行以下操作:

    size_t len;
    fseek(fp, 0, SEEK_END);
    len = ftell(fp);
    rewind(fp);
    

    len 将包含文件的大小(以字节为单位) .

    1:假设你调用 fread ,参数2设置为每个元素1个字节,并且没有尝试读取比文件中实际更多的字节 .

  • 0

    您的主要问题是already been answered,但值得注意的是,strlen不是为了测量数组的大小而是为了以NULL结尾的字符串 . 它可能会打印一个较低的值,因为strlen返回在null-char之前出现的字符数,因此如果你的数据中有nullchars('\0'),strlen会在找到其中一个时立即停止 .

    你应该相信fread的回报 Value .

    EDIT: 作为注释,fread可以读取比请求的更少的字节,并且它可以由错误或文件结尾引起 . 你可以分别用ferror和feof来检查它 .

相关问题