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

前端之家收集整理的这篇文章主要介绍了c-fwrite()替代32位系统上的大文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图用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]),fp);
    }

fclose(fp);

解决方法

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

赋值运算符(* =)将作用于l值(unsigned long long int),因此您可以信任它作为64位值.

这可能看起来没有优化,但一个体面的编译器将删除任何不必要的步骤.

猜你在找的C&C++相关文章