11

这是我当前的问题:我正在尝试用 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 个字节,1 MB 有 1024KB。因此,如果我想要一个 2 MB 的文件,我必须将 1024*1024*2 字节写入该文件。是的?

我没有遇到任何错误,但我最终得到了一个 0 字节的文件......我不确定我在这里做错了什么,所以任何帮助将不胜感激!

谢谢!

4

3 回答 3

23

可能稀疏的文件

这将创建output.img大小 300 MB:

#include <fstream>

int main()
{
    std::ofstream ofs("ouput.img", std::ios::binary | std::ios::out);
    ofs.seekp((300<<20) - 1);
    ofs.write("", 1);
}

请注意,从技术上讲,这将是触发文件系统对稀疏文件的支持的好方法。

密集文件 - 用 0 填充

功能与上述相同,但用 0 填充文件:

#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;
        }
    }
}
于 2011-10-25T21:25:50.800 回答
2

您的代码不起作用,因为您正在使用fputs它将以空字符结尾的字符串写入输出缓冲区。但是您正在尝试写入所有空值,因此当它查看字符串的第一个字节时它会立即停止并最终什么也不写。

现在,要创建一个特定大小的文件,您需要做的就是只调用一次truncate函数(或_chsiz对于 Windows)并设置您希望文件的大小。

祝你好运!

于 2011-10-25T21:24:47.467 回答
0

要制作 2MB 的文件,您必须寻找2*1024*1024并写入0字节。fput()ting 空字符串不管多少次都没有用。并且字符串为空,因为字符串以 0 结尾。

于 2011-10-25T21:22:04.580 回答