C ++ Сделать файл определенного размера - PullRequest
6 голосов
/ 26 октября 2011

Вот моя текущая проблема: я пытаюсь создать файл размером x МБ в C ++.Пользователь вводит имя файла, затем вводит число от 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 байту.В 1 КБ есть 1024 байта, а в МБ - 1024 КБ.Поэтому, если бы я хотел файл размером 2 МБ, мне пришлось бы записать в этот файл 1024 *1024* 2 байта.Да?

Я не сталкиваюсь с какими-либо ошибками, но получаю файл с 0 байтами ... Я не уверен, что я делаю здесь неправильно, поэтому любая помощь будет принята с благодарностью!

Спасибо!

Ответы [ 3 ]

14 голосов
/ 26 октября 2011

Вот как все будет выглядеть в фактическом c ++

Edit Вот более короткий вариант, который делает функционально одинаковым (пример создает output.img из 300 МБ):

#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;
        }
    }
}
2 голосов
/ 26 октября 2011

Ваш код не работает, потому что вы используете fputs, который записывает строку с нулевым символом в конце в выходной буфер.Но вы пытаетесь записать все нули, поэтому он останавливается, когда просматривает первый байт вашей строки, и в итоге ничего не записывает.

Теперь, чтобы создать файл определенного размера, все, что вам нужноДля этого нужно вызвать функцию truncate (или _chsiz для Windows) ровно один раз и установить желаемый размер файла.

Удачи!

1 голос
/ 26 октября 2011

Чтобы создать файл размером 2 МБ, нужно найти 2*1024*1024 и записать 0 байтов.fput() пустая строка ничего не даст, сколько бы раз.И строка пуста, потому что строки 0 заканчиваются.

...