5

Create a flat text file in c++ around 50 - 100 MB with the content 'Added first line' should be inserted in to the file for 4 million times

4

6 に答える 6

17

古いスタイルのファイルを使用するio

書き込み用にファイルを開きます。

目的のファイルサイズにfseek -1。

1バイトをfwrite

ファイルを閉じます

于 2008-11-05T15:49:50.150 に答える
12

The fastest way to create a file of a certain size is to simply create a zero-length file using creat() or open() and then change the size using chsize(). This will simply allocate blocks on the disk for the file, the contents will be whatever happened to be in those blocks. It's very fast since no buffer writing needs to take place.

于 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

OSについては言及していませんが、作成/オープン/クローズ/書き込みが利用可能であると想定します。

真に効率的な書き込みと、たとえば 4k ページとディスク ブロック サイズ、および繰り返される文字列を想定するには、次のようにします。

  1. ファイルを開きます。
  2. 理想的にはページ境界に合わせて、繰り返される文字列に 4k * 文字数を割り当てます。
  3. 繰り返される文字列をメモリに 4k 回出力し、ブロックを正確に埋めます。
  4. write() を使用して、必要な回数だけブロックをディスクに書き出します。サイズを適切にするために、最後のブロックの部分ピースを書きたいと思うかもしれません。
  5. ファイルを閉じます。

これにより、fopen() とその仲間のバッファリングが回避されます。これには良い面と悪い面があります。それらのバッファリングは、それらが適切で高速であることを意味しますが、バッファを操作するオーバーヘッドがないため、これほど効率的ではありません。 .

これは C++ または C で簡単に記述できますが、効率のために iostream や stdio ではなく POSIX 呼び出しを使用することを前提としているため、コア ライブラリ仕様の範囲外です。

于 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 はほぼ瞬時にファイルを作成します。一度に 1 バイトの fwrite() と比較すると、10 秒で完了します。4k バッファの受け渡しは 2 秒で完了します。

于 2019-08-29T08:44:24.980 に答える