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

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

概述我试图用C代码生成大文件(4-8 GB). 现在我使用fopen()与’wb’参数来打开文件二进制和fwrite()函数for循环将文件写入文件.我在每个循环迭代中写一个字节.直到文件大于或等于4294967296字节(4096 MB)才有问题.它在32位 *** 作系统中看起来像一些内存限制,因为当它写入该打开的文件时,它仍然在RAM中.我对吗?症状是创建的文件的尺寸比我想要的要小.差异是4096 MB 我试图用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; //MBchar 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-fwrite()替代32位系统上的大文件全部内容,希望文章能够帮你解决c-fwrite()替代32位系统上的大文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存