gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:41:55 31 4
gpt4 key购买 nike

我正在尝试使用 C 代码生成大文件 (4-8 GB)。现在我使用 fopen()'wb' 参数来打开二进制文件和 for 中的 fwrite() 函数循环将字节写入文件。我在每个循环迭代中写一个字节。在文件大于或等于 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);

最佳答案

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

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

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

关于c - fwrite() 替代 32 位系统上的大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16519834/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com