Самый быстрый способ создать большой файл в C ++? - PullRequest
5 голосов
/ 05 ноября 2008

Создание плоского текстового файла в C ++ около 50 - 100 МБ с содержимым «Добавлена ​​первая строка», которое нужно вставить в файл 4 миллиона раз

Ответы [ 5 ]

16 голосов
/ 05 ноября 2008

с использованием файла старого стиля io

fopen файл для записи.

fseek до нужного размера файла - 1.

fwrite один байт

fclose Файл

11 голосов
/ 05 ноября 2008

Самый быстрый способ создать файл определенного размера - просто создать файл нулевой длины, используя creat() или open(), а затем изменить размер, используя chsize(). Это просто выделит блоки на диске для файла, содержимое будет тем, что было в этих блоках. Это очень быстро, поскольку нет необходимости в записи в буфер.

2 голосов
/ 05 ноября 2008

Не уверен, что понимаю вопрос. Хотите убедиться, что каждый символ в файле является печатным символом ASCII? Если так, то как насчет этого? Заполняет файл "abcdefghabc ...."

#include <stdio.h>
int main ()
{
   const int FILE_SiZE = 50000; //size in KB
   const int BUFFER_SIZE = 1024;
   char buffer [BUFFER_SIZE + 1];
   int i;
   for(i = 0; i < BUFFER_SIZE; i++)
      buffer[i] = (char)(i%8 + 'a');
   buffer[BUFFER_SIZE] = '\0';

   FILE *pFile = fopen ("somefile.txt", "w");
   for (i = 0; i < FILE_SIZE; i++)
     fprintf(pFile, buffer);

   fclose(pFile);

   return 0;
}
1 голос
/ 05 мая 2009

Вы не упомянули операционную систему, но я предполагаю, что create / open / close / write доступны.

Для действительно эффективной записи и, скажем, размера страницы в 4 Кбайт и диска и повторяющейся строки:

  1. открыть файл.
  2. выделяет 4k * количество символов в повторяющейся строке, идеально выровненных по границе страницы.
  3. выводит повторную строку в память 4k раз, точно заполняя блоки.
  4. Используйте write () для записи блоков на диск столько раз, сколько необходимо. Вы можете написать частичную часть для последнего блока, чтобы получить правильный размер.
  5. закрыть файл.

Это обходит буферизацию fopen () и друзей, что хорошо и плохо: их буферизация означает, что они хороши и быстры, но они все равно не будут столь же эффективны, как эта, что не требует дополнительных трудозатрат. с буфером.

Это может быть легко написано на C ++ или C, но предполагается, что вы будете использовать вызовы POSIX вместо iostream или stdio для эффективности, так что это выходит за рамки спецификации базовой библиотеки.

0 голосов
/ 13 августа 2016

Самый быстрый способ создать большой файл в C ++? Хорошо. Я предполагаю, что самый быстрый способ означает тот, который занимает наименьшее время выполнения.

Создайте плоский текстовый файл в C ++ размером около 50 - 100 МБ с содержимым «Добавлена ​​первая строка», который должен быть вставлен в файл 4 миллиона раз. предварительно выделить файл, используя файл старого стиля io

fopen the file for write.
fseek to the desired file size - 1.
fwrite a single byte
fclose the file

create a string containing the "Added first line\n" a thousand times.
find it's length.

предварительно выделить файл, используя файл старого стиля io

fopen the file for write.
fseek to the the string length * 4000
fwrite a single byte
fclose the file

open the file for read/write
loop 4000 times, 
    writing the string to the file.
close the file.

Это мое лучшее предположение. Я уверен, что есть много способов сделать это.

...