2008-11-05 2 views
3

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

+0

Я думаю, все зависит от того, какой именно текст вам нужен в файле, и что вы подразумеваете под «лучшим». Самый быстрый? Я предполагаю, что многократное написание буфера, содержащего образец текста, доставит вас туда быстрее. Выбор размера буфера для получения максимальной скорости требует экспериментов. – 2008-11-05 15:44:16

+1

«Лах» - это индийское слово за 10 000 человек. – ijw 2009-05-05 11:49:13

ответ

15

используя старый файл стиля И.О.

Еореп файл для записи.

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

FWRITE один байт

fclose файл

+0

1) забыл «Добавленная первая строка» 2) физически не выделяет все ОС/файловые системы. Некоторые оставляют промежуточные блоки нераспределенными. raj должен сказать, действительно ли дисковое пространство должно быть физически выделено или только логически. – blabla999 2009-01-13 20:23:34

+0

Что такое 40 lakhs time mean? – EvilTeach 2009-01-13 21:25:13

10

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

2

Не уверен, что я понял вопрос. Вы хотите убедиться, что каждый символ в файле является печатным символом 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

Вы не упомянули ОС, но я предполагаю, что Creat/открыть/закрыть/записи доступны.

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

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

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

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

0

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

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

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

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. 

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

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. 

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

Смежные вопросы