【问题标题】:C++ Make a file of a specific sizeC++ 创建一个特定大小的文件
【发布时间】:2011-12-15 07:29:46
【问题描述】:

这是我当前的问题:我正在尝试用 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 字节的文件...我不确定我在这里做错了什么,因此非常感谢任何帮助!

谢谢!

【问题讨论】:

  • 你觉得fputs怎么知道要写多少字节?
  • fwrite 或 seek/putc('0') 将是您最简单的选择。
  • 不要忘记处理错误(例如检查argc
  • @MooingDuck:我觉得老师会拿一个红色的马克笔,把putc('0')改成putc(0)或者putc('\0')。此时,学生应拿起红色记号笔,用力划掉课程名称中出现的++ 标志:)

标签: c++ fopen fputs


【解决方案1】:

可能是稀疏文件

这会创建大小为 300 MB 的 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);
}

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

密集文件 - 用 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;
        }
    }
}

【讨论】:

  • 添加了一个三行解决方案,通过制作稀疏文件来节省空间。
  • 这行得通,但我不明白 ofs.seekp((300
  • &lt;&lt;bitwise shift-left operation。二进制数左移一位相当于乘以 2。所以左移 10 位相当于乘以 1024 (2**10)。在没有C++11 userdefined literals like 300Mb 的情况下,这是一个方便的简写
  • 谢谢!完全忘记了位移:S
【解决方案2】:

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

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

祝你好运!

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 写入 0 字节(例如 ofstream::write("", 0))不起作用。
    • 我不认为 ofstream 保证写入 0 字节,老实说,我不知道应该如何使用 ofstream 来处理它,而不是从中获取 fd 并对其施展魔法。老实说,我不认为设置文件的大小是非常“流式”的活动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多