安全的 fread 函数读取记录的最大数量是多少?

7

我正在使用fread从文件中读取大量的图像数据(> 1 MB)。最近在MinGW和Windows网络共享时遇到了一个bug,其中单个fread调用如下:

fread(file, 4, 100000, data);

无论如何,都会出现“无效参数”错误,并且连续调用10次。
fread(file, 4, 10000, data); data += 10000;

成功并且得到正确的结果。我推断fread函数应该有一个最大尺寸,这一点在之前是我没有意识到的。我将允许的fread大小一分为二,发现其介于31000和32000块4字节之间。有人以前遇到过这个问题吗?这是MinGW的一个bug吗?有什么方法可以确定fread的最大“安全”尺寸吗?


2
这很奇怪,特别是 EINVAL 不是 fread 的记录错误代码。你如何进行错误检查? - Mat
2
fileFILE * 吗?因为 fread 的第一个参数是缓冲区,而不是文件。 - Hasturkun
Hasturkun:抱歉,我的参数弄乱了。file 是一个 float* 类型的变量,而 data 是一个 FILE* 类型的变量。 - thiton
我正在使用ferror()检查错误是否存在,并通过strerror()获取错误消息(perror()也给出了相同的结果)。 - thiton
2个回答

8

在MSVCRT(即mingw使用的Microsoft Visual C Runtime)中存在一个已知的bug,即fread(以及底层的_read或其他什么东西..?)在读取长度适中的数据时会失败。你可以将读取分成较小的部分,编写自己的fread版本来替换系统版本(但只有在编译受损系统时才这样做!),或者切换到更好的运行时环境(如cygwin),它不会充满漏洞...


在破损的系统上编译?你是指为破损的系统编译吗? - Prof. Falken

2

fread() 不应该返回一个短的项目计数,除非发生了读取错误或到达了文件结尾。这听起来像是你链接的 C 库中的一个 bug(MinGW 默认链接 Microsoft 的 C 库吗?)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接