Я должен создать текстовый файл определенного размера, пользователь вводит размер. Все, что мне нужно знать, - это сделать файл быстрее. В настоящее время создание файла размером 10 МБ занимает около 15 секунд. Я должен уменьшить это до 5 секунд. Как я могу это сделать? В настоящее время я делаю свой файл
void create_file()
{
int size;
cout<<"Enter size of File in MB : ";
cin>>file_size;
size = 1024*1024*file_size; // 1MB = 1024 * 1024 bytes
ofstream pFILE("my_file.txt", ios::out);
for(int i=0; i<size; i++) //outputting spces to create file
pFILE<<' ';
pFILE.close();
}
Обновление, это то, что я использую сейчас, но я получаю значение мусора, записанное в файл,
void f_c()
{
int i, size;
cin>>size;
FILE * new_file = fopen("FILE TEST.txt", "w");
char buffer[1024];
memset(buffer,' ', 1024);
for(i = 0; i<1024 * size; i++)
fputs(buffer, new_file);
getchar();
}
Вы заполняете его по одному символу за раз. Вместо этого вы могли бы выделить большую часть памяти, используя new
а затем записать более крупные куски одновременно, чтобы ускорить процесс. Вы можете использовать memset
в выделенной памяти, чтобы предотвратить наличие байтов в памяти. Но также посмотрите на комментарий о дублированном вопросе, есть даже более быстрые методы, если у файла не должно быть определенного контента изначально.
Вот простой пример, но без проверки ошибок.
Допустим, вы хотите размер 1000:
#include <fstream>
int main () {
int size = 1000;
const char* filename= "file.txt";
std::ofstream fout(filename);
fout.fill (' ');
fout.width (size);
fout << " ";
return 0;
}
Вам не нужно заполнять все байты в файле, если вы просто хотите создать большой файл, который сделает его медленным, просто скажите файловой системе, насколько большой вы хотите
В Linux используйте truncate
truncate("data.txt",1024*1024*1024);
Windows использует SetFilePointer
SetFilePointer (hFile, 1024*1024*1024, NULL, FILE_BEGIN);
оба из них могут создать неинициализированный файл с некоторыми гигабайтами менее чем за секунды.