5

在 C++ 中创建一个大约 50 - 100 MB 的平面文本文件,内容“添加的第一行”应插入文件中 400 万次

4

6 回答 6

17

使用旧式文件 io

f打开文件进行写入。

fseek到所需的文件大小 - 1。

f写入单个字节

f关闭文件

于 2008-11-05T15:49:50.150 回答
12

创建特定大小文件的最快方法是使用creat()or创建一个长度为零的文件open(),然后使用chsize(). 这将只是在磁盘上为文件分配块,内容将是这些块中发生的任何内容。它非常快,因为不需要进行缓冲区写入。

于 2008-11-05T15:49:52.787 回答
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;
}
于 2008-11-05T15:54:52.963 回答
1

您没有提到操作系统,但我假设 creat/open/close/write 可用。

对于真正有效的写入和假设,例如 4k 页面和磁盘块大小以及重复字符串:

  1. 打开文件。
  2. 在重复的字符串中分配 4k * 字符数,理想情况下与页面边界对齐。
  3. 将重复的字符串打印到内存中 4k 次,精确地填充块。
  4. 使用 write() 根据需要多次将块写入磁盘。您可能希望为最后一个块编写部分片段以使大小正确。
  5. 关闭文件。

这绕过了 fopen() 和朋友的缓冲,这有好有坏:它们的缓冲意味着它们又好又快,但它们仍然不会像这样有效,它没有使用缓冲区的开销.

这可以很容易地用 C++ 或 C 编写,但为了提高效率,假设您将使用 POSIX 调用而不是 iostream 或 stdio,因此它超出了核心库规范。

于 2009-05-05T11:55:51.620 回答
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 几乎可以立即创建文件。与 fwrite() 一次 1 个字节相比,这将在 10 秒内完成。通过 4k 缓冲区将在 2 秒内完成。

于 2019-08-29T08:44:24.980 回答
0

在 C++ 中创建大文件的最快方法? 行。我认为最快的方式是指运行时间最短的方式。

在 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.

这是我最好的猜测。我敢肯定有很多方法可以做到这一点。

于 2016-08-12T23:16:56.947 回答