0
#include<fstream.h>
#include<conio.h>
#include<alloc.h>

class profile
{
   public: char *copyBytes;
}p;

void main()
{
   unsigned int size;

   fstream file ("file.mp3", ios::binary | ios::in | ios::out);
   fstream copy ("copy.mp3", ios::binary | ios::in | ios::out);
   file.seekg(0, ios::end);
   size=file.tellg();
   file.seekg(0);

   while(!file.eof())
   {
    p.copyBytes=(char*)malloc(size);
    file.read((char*)p.copyBytes, size);
    copy.write((char*)p.copyBytes, size);
    free(p.copyBytes);
   }

   file.close();

}

このプログラムは、バイナリ ファイル file.mp3 のコピーを作成します。元のバイナリ ファイル (file.mp3) は 2.13 MB で、コピーされたファイル (copy.mp3) は 2.14 MB です。なんで?

4

1 に答える 1

5
  1. のようなループは使いたくないでしょうwhile (!file.eof())。代わりに、次のようにして、読み取り操作が成功したことを確認します。

    while (file.read(....))
    

    eof フラグは、次の読み取り操作によってのみ設定される可能性があるため、読み取り前にチェックすることは役に立ちません。

  2. 常にバッファ全体を出力ファイルに書き込んでいますがread、バッファの一部しか読み取れない場合があります。file.gcount()読み取られたバイト数を確認するために使用します。

バッファ サイズはファイル サイズと同じである必要はないことに注意してください。これは、メモリに収まらないファイルでは機能しません。一定サイズのバッファを単純に使用できます。ループはファイル全体をコピーします。

于 2012-08-05T14:22:00.440 に答える