微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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位值.

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

原文地址:https://www.jb51.cc/c/115777.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐