11

現在の問題は次のとおりです。C++でxMBのファイルを作成しようとしています。ユーザーはファイル名を入力してから、作成するファイルのサイズとして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文字は1バイトです。1KBには1024バイト、MBには1024KBがあります。したがって、2 MBのファイルが必要な場合は、このファイルに1024 * 1024*2バイトを書き込む必要があります。はい?

エラーは発生しませんが、ファイルが0バイトになります...ここで何が間違っているのかわからないので、助けていただければ幸いです。

ありがとう!

4

3 に答える 3

23

潜在的にスパースファイル

これによりoutput.img、サイズが300MBになります。

#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

fputsnullで終了する文字列を出力バッファに書き込むを使用しているため、コードは機能しません。しかし、あなたはすべてのnullを書き込もうとしているので、文字列の最初のバイトを見るとすぐに停止し、結局何も書きません。

truncateここで、特定のサイズのファイルを作成するには、関数(または_chsizWindowsの場合)を1回だけ呼び出して、ファイルのサイズを設定するだけです。

幸運を!

于 2011-10-25T21:24:47.467 に答える
0

2MBのファイルを作成するには、バイトを探して2*1024*1024書き込む必要があります。空の文字列を入力しても、何度行っても効果はありません。また、文字列は0で終了しているため、文字列は空です。0fput()

于 2011-10-25T21:22:04.580 に答える