fwrite()替代32位系统上的大文件

bLA*_*LAZ 10 c windows file-io

我正在尝试用C代码生成大文件(4-8 GB).现在我用fopen()'wb'参数来打开文件的二进制和fwrite()在功能上for环要写入的字节到文件.我在每次循环迭代中写一个字节.在文件大于或等于4294967296字节(4096 MB)之前没有问题.它看起来像32位操作系统中的一些内存限制,因为当它写入打开的文件时,它仍然在RAM中.我对吗?症状是创建的文件比我想要的更小.差异是4096 MB,例如,当我想要6000 MB文件时,它创建6000 MB - 4096 MB = 1904 MB文件.

你能建议其他方法来完成这项任务吗?

问候 :)

部分代码:

unsigned long long int number_of_data = (unsigned int)atoi(argv[1])*1024*1024; //MB
char x[1]={atoi(argv[2])};

fp=fopen(strcat(argv[3],".bin"),"wb");

    for(i=0;i<number_of_data;i++) {
        fwrite(x, sizeof(x[0]), sizeof(x[0]), fp);
    }

fclose(fp);
Run Code Online (Sandbox Code Playgroud)

Lee*_*ton 2

fwrite不是这里的问题。问题是您正在计算的值number_of_data

处理 64 位整数时,您需要小心任何无意的 32 位转换。当我定义它们时,我通常会分几个独立的步骤来完成,并且每个步骤都要小心:

unsigned long long int number_of_data = atoi(argv[1]); // Should be good for up to 2,147,483,647 MB (2TB)
number_of_data *= 1024*1024; // Convert to MB
Run Code Online (Sandbox Code Playgroud)

赋值运算符 ( *=) 将作用于左值 (the unsigned long long int),因此您可以相信它作用于 64 位值。

这可能看起来没有优化,但是一个好的编译器会删除任何不必要的步骤。