现在我使用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位系统上的大文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)