Какой самый быстрый способ создать 1 ГБ файл, заполненный нулями в C / C ++? - PullRequest
6 голосов
/ 21 марта 2012

Мне нужно создать огромный двоичный файл, заполненный нулями в ОС Windows.Размер указан.Какой самый эффективный способ сделать это в C / C ++?

Ответы [ 5 ]

6 голосов
/ 21 марта 2012

Попробуйте вызвать truncate(2):

truncate("/my/file", my_size);

Для получения дополнительной информации,

man 2 truncate

Функции truncate () и ftruncate () вызывают обычный файл с именем pathили ссылка на fd обрезается до размера байтов с точной длиной.

Если файл ранее был больше этого размера, дополнительные данные будут потеряны.Если файл ранее был короче, он расширяется, и расширенная часть читается как нулевые байты ('\ 0').

Если вы ищете встроенную функцию Windows, взгляните на SetEndOfFile , который делает то же самое.

5 голосов
/ 21 марта 2012

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

Если файл может содержать «дыры», в которых данные не определены (что на самом деле уже есть на диске), вы можете выполнить поиск до указанного размера и записать один байт.

1 голос
/ 21 марта 2012

В случае, если кому-то интересно, как я решил мою проблему здесь:

void CreateBlankFile(LPSTR str, long lsize) {
    DWORD dwErr;
    HANDLE file = CreateFile(str, 
                             GENERIC_WRITE,
                             FILE_SHARE_WRITE,
                             NULL,
                             CREATE_ALWAYS,
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);
    dwErr = GetLastError();
    if (dwErr > 0) {
        //some error message should be here
        return;
    }
    SetFilePointer(file, lsize, 0, FILE_BEGIN);
    SetEndOfFile(file);
    CloseHandle(file);
}
1 голос
/ 21 марта 2012

«Самый быстрый» зависит от платформы. В unix используйте open и write системные вызовы; Обязательно вызовите запись с большим буфером (~ 1 МБ).

0 голосов
/ 21 марта 2012

Может быть, это то, что вы ищете, SPARSE файл.Файлы такого типа обычно создаются программами обмена файлами ...

http://www.flexhex.com/docs/articles/sparse-files.phtml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...