【问题标题】:ifstream read and fread not returning same data, C++ifstream read 和 fread 不返回相同的数据,C++
【发布时间】:2012-05-06 14:09:05
【问题描述】:

我的问题是在文件描述符上使用 ifstream read 和 fread 似乎不会产生相同的结果。

我在 ios::binary 模式下使用 ifstream open/read 打开一个文件并读取其输入。然后我把这个缓冲区写到一个文件中。 out1.

接下来,我打开同一个文件,使用 FILE* 文件描述符和 fread 读取其输入。然后我把这个缓冲区写到另一个文件out2中。

当我比较 out1 和 out2 时,它们不匹配。使用 FILE* 的 out2 似乎在接近尾声时停止读取。

更令人担忧的是,没有一个缓冲区与输入文件匹配。 ifstream::read 方法似乎正在修改行尾字符,即使我将输入文件打开为 ios::binary。

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;

【问题讨论】:

  • 当你使用fopen时,你没有指定二进制模式rb

标签: c++ ifstream fread


【解决方案1】:

您调用fopen() 进行读取使用mode r 而不是mode rb 并使用mode w 而不是mode wb 进行写入,这在Windows 上(默认)意味着您同时使用文本翻译,不是二进制模式。

【讨论】:

  • 谢谢你,聪明的裤子先生...我现在感觉很笨。将在 5 分钟内标记为答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多