创建一个大约50 - 100 MB的c ++平面文本文件 内容'添加第一行'应插入文件400万次
答案 0 :(得分:16)
使用旧样式文件io
fopen 要写的文件。
fseek 到所需的文件大小 - 1。
fwrite 单个字节
fclose 文件
答案 1 :(得分:11)
创建特定大小文件的最快方法是使用creat()
或open()
创建一个零长度文件,然后使用chsize()
更改大小。这将简单地在磁盘上为文件分配块,内容将是这些块中发生的任何内容。它非常快,因为不需要进行缓冲区写入。
答案 2 :(得分: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;
}
答案 3 :(得分:1)
你没有提到操作系统,但我会假设创建/开/关/写可用。
为了真正有效地编写并假设,例如,4k页面和磁盘块大小以及重复的字符串:
这绕过了fopen()和朋友的缓冲,这是好的和坏的:他们的缓冲意味着它们很好而且快速,但它们仍然没有那么高效,没有工作的开销用缓冲区。
这可以很容易地用C ++或C编写,但是假设你为了效率而打算使用POSIX调用而不是iostream或stdio,所以它不在核心库规范之内。
答案 4 :(得分:1)
我遇到了同样的问题,非常快地在Windows上创建了一个约500MB的文件。 传递给fwrite()的较大缓冲区将是最快的速度。
int i;
FILE *fp;
fp = fopen(fname,"wb");
if (fp != NULL) {
// create big block's data
uint8_t b[278528]; // some big chunk size
for( i = 0; i < sizeof(b); i++ ) // custom initialization if != 0x00
{
b[i] = 0xFF;
}
// write all blocks to file
for( i = 0; i < TOT_BLOCKS; i++ )
fwrite(&b, sizeof(b), 1, fp);
fclose (fp);
}
现在至少在我的Win7 MinGW上几乎可以立即创建文件。 与时间1个字节的fwrite()相比,该操作将在10秒内完成。 通过4k缓冲区将在2秒内完成。
答案 5 :(得分:0)
用c ++创建大文件的最快方法? 好。我认为最快的方式意味着运行时间最短的那个。
使用内容&#39;添加第一行&#39;在c ++中创建一个大约50 - 100 MB的平面文本文件。应该插入文件400万次。
使用旧样式文件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.
这是我最好的猜测。 我确信有很多方法可以做到。