这是我当前的问题:我正在尝试用C ++创建一个x MB的文件。用户将输入文件名,然后输入5到10之间的数字作为他们想要创建的文件的大小。在这个项目的后期,我会用它来做其他的事情,但我仍然坚持创造这个糟糕的事情的第一步。
我的问题代码(到目前为止):
char empty[1024];
for(int i = 0; i < 1024; i++)
{
empty[i] = 0;
}
fileSystem = fopen(argv[1], "w+");
for(int i = 0; i < 1024*fileSize; i++){
int temp = fputs(empty, fileSystem);
if(temp > -1){
//Sucess!
}
else{
cout<<"error"<<endl;
}
}
现在如果我正确地进行数学运算1 char是1byte。 1KB中有1024个字节,MB中有1024KB。所以,如果我想要一个2 MB的文件,我必须写入1024 * 1024 * 2字节到这个文件。是
我没有遇到任何错误,但我最终得到一个0字节的文件......我不确定我在这里做错了所以任何帮助都会非常感激!
谢谢!
答案 0 :(得分:14)
以下是实际 c ++
中的内容 修改以下是功能性相同的缩写变体(示例创建300 {m}的output.img
):
#include <fstream>
int main()
{
std::ofstream ofs("ouput.img", std::ios::binary | std::ios::out);
ofs.seekp((300<<20) - 1);
ofs.write("", 1);
}
请注意,从技术上讲,这将是触发文件系统支持稀疏文件的好方法。
#include <iostream>
#include <fstream>
#include <vector>
int main()
{
std::vector<char> empty(1024, 0);
std::ofstream ofs("ouput.img", std::ios::binary | std::ios::out);
for(int i = 0; i < 1024*300; i++)
{
if (!ofs.write(&empty[0], empty.size()))
{
std::cerr << "problem writing to file" << std::endl;
return 255;
}
}
}
答案 1 :(得分:2)
您的代码不起作用,因为您正在使用fputs
将空终止字符串写入输出缓冲区。但是你试图编写所有空值,所以当它查看字符串的第一个字节并且最终没有写任何内容时它会停止。
现在,要创建特定大小的文件,您只需要调用truncate
函数(或Windows的_chsiz
)一次,并设置您希望文件的大小
答案 2 :(得分:1)
要生成2MB文件,您必须寻找2*1024*1024
并写入0
个字节。无论多少次,fput()
空字符串都无济于事。字符串是空的,因为字符串是0终止的。