0

私の問題は、ファイル記述子で ifstream read と fread を使用しても同じ結果が得られないように見えることです。

ファイルを開き、ios::binary モードで ifstream open/read を使用してその入力を読み取ります。次に、このバッファーをファイルに書き出します。out1.

次に、同じファイルを開き、FILE* ファイル記述子と fread を使用してその入力を読み取ります。次に、このバッファを別のファイル out2 に書き出します。

out1 と out2 を比較すると、一致しません。FILE* を使用する out2 は、最後近くで読み取りを停止するようです。

さらに気になるのは、どちらのバッファも入力ファイルと一致しないことです。入力ファイルを ios::binary として開いているにもかかわらず、ifstream::read メソッドが行末文字を変更しているようです。

fread メソッドは、読み取られたバッファを見ることができるため、それよりもかなり多くの文字を読み取っていますが、長さ (199) 未満の値を返しているようです。これは、seekg コマンドによって決定される長さと一致しません。

私はかなり混乱しており、どんな助けもいただければ幸いです。コードが付属しています。

ありがとう!-ジュリアン

   ifstream read_file;
   read_file.open("V:\\temp\\compressiontest\\out\\test_20224-5120_256x256.jpg", ios::binary);

   read_file.seekg(0, ios::end);
   unsigned long length = read_file.tellg();
   cout << "Length: " << length << endl;
   read_file.seekg(0, ios::beg);

   unsigned char* buffer = new unsigned char[length];
   unsigned char* buf = new unsigned char[length];
   for(int i = 0; i < length; i++)
   {
      buffer[i] = 0;
      buf[i] = 0;
   }

   if(read_file.is_open())
   {
      read_file.read((char*)buffer, length);
   }
   else
   {
      cout << "not open" << endl;
   }

   read_file.close();

   FILE* read_file_1 = NULL;
   read_file_1 = fopen("V:\\temp\\compressiontest\\out\\test_20224-5120_256x256.jpg", "r");
   size_t read_len = fread(buf, 1, length, read_file_1);
   fclose(read_file_1);

   if(read_len != length)
      cout << "read len != length" << " read_len: " << read_len << " length: " << length << endl;

   int consistent = 0;
   int inconsistent = 0;
   for(int i = 0; i < length; i++)
   {
      if(buf[i] != buffer[i])
         inconsistent++;
      else
         consistent++;
   }

   cout << "inconsistent:" << inconsistent << endl;
   cout << "consistent:" << consistent << endl;

   FILE* file1;
   file1 = fopen("V:\\temp\\compressiontest\\out1.jpg", "w"); 
   fwrite((void*) buffer, 1, length, file1);
   fclose(file1);

   FILE* file2;
   file2 = fopen("V:\\temp\\compressiontest\\out2.jpg", "w"); 
   fwrite((void*) buf, 1, length, file2);
   fclose(file2);

   return 0;
4

1 に答える 1

4

の代わりに を使用して読み取り用に、 の代わりに を使用して書き込み用にfopen ( )を呼び出しています。これは、Windows (デフォルト) では、バイナリ モードではなく、テキスト変換を使用して読み取りと書き込みの両方を行っていることを意味します。mode rmode rbmode wmode wb

于 2012-04-25T20:42:03.620 に答える