C 具有大nitems参数的fread平台相关行为

C 具有大nitems参数的fread平台相关行为,c,portability,fread,stdio,C,Portability,Fread,Stdio,我创建了下面的测试程序,试图在更大的系统中调试一个问题。该程序试图从一个小文件中读取大量数据,但我发现程序的行为在不同平台上有所不同 预期行为 我预期的行为,以及我在某些平台(例如Mac OS X、CentOS 6.4)上看到的行为,是程序读取N字节(文件大小),然后以EOF条件终止: Read 2 bytes. OK. EOF 对于我的测试,我使用echo“a”>test.txt创建了test.txt,它应该是strerror(errno),而不是err。四个感叹号简直太傻了。@Jenserr

我创建了下面的测试程序,试图在更大的系统中调试一个问题。该程序试图从一个小文件中读取大量数据,但我发现程序的行为在不同平台上有所不同

预期行为

我预期的行为,以及我在某些平台(例如Mac OS X、CentOS 6.4)上看到的行为,是程序读取N字节(文件大小),然后以
EOF
条件终止:

Read 2 bytes. OK. EOF
对于我的测试,我使用
echo“a”>test.txt创建了test.txt,它应该是
strerror(errno)
,而不是err。四个感叹号简直太傻了。@Jens
err
是我将
ferror
中的错误代码存储在--
fread
没有设置
errno
你的CentOS有足够的内存和交换空间吗?@Les我想是的。。。它在
malloc
步骤中没有失败。根据read()的手册页,最大字符数受系统定义的值限制:“SSIZE_max”是否检查了该值,并确保请求读取的代码的1/2 gig字节小于该大小。 Read 0 bytes. NOOOOOOOOOOOOOO!!!! Error: Operation not permitted
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    FILE* file = fopen("test.txt", "rb");
    size_t chunk = 0x7FFFFFFF;
    char* buf = malloc(chunk);
    if (buf == NULL) {
        printf("malloc failed\n");
        return 1;
    }
    int count = fread(buf, 1, chunk, file);
    printf("Read %i bytes.\n", count);
    int eof = feof(file);
    if (eof) {
        printf("OK. EOF\n");
    }
    int err = ferror(file);
    if (err) {
        printf("NOOOOOOOOOOOOOO!!!! Error: %s\n", strerror(err));
        return 1;
    }
    free(buf);
    return 0;
}