【问题标题】:When reading in a binary file as a char * buffer, it keep reading it as binary instead of as characters在将二进制文件作为 char * 缓冲区读取时,它会继续将其作为二进制而不是字符读取
【发布时间】:2020-03-06 18:13:44
【问题描述】:
void reader(string fileName){
     ifstream ifile; 
     ifile.open(fileName, ios::binary | ios::in);
     ifile.seekg (0, ifile.end);
     int length = ifile.tellg();
     ifile.seekg (0, ifile.beg);
     char * buffer = new char [length];
while(ifile.good()){

    // read data as a block:
    ifile.read (buffer,4);
    cout << buffer <<endl;
    //ifile.read((char *)&inputName, sizeof(int));
    //cout << inputName;

}
ifile.close();

它给出的输出如下所示:

▒d▒▒root.d[$Apd▒▒
endXroot.d

当我希望它看起来更像时

root.d
endXroot.d

数据作为 root.d/0endXroot.d idk 输入到文件中,无论是否有帮助。

【问题讨论】:

  • ifile.read (buffer,4); 读取四个字节。请注意,这不一定包括空终止符。 cout &lt;&lt; buffer &lt;&lt;endl;buffer 的内容打印为空终止字符串,它可能不是。混乱随之而来。会回答,但我不能 100% 解释 ▒d▒▒。可能byte order mark?
  • 如果您将int 作为二进制 blob 写入文件,它将以二进制 blob 的形式出现在另一端。奇怪的是▒d▒▒ 是那个二进制 blob。
  • 完全取决于你需要做什么。在这种情况下,您似乎只希望输出为文本。在这种情况下,只有文本进入文件是理所当然的。
  • 查看第一条评论并注意关于以空字符结尾的字符串。
  • 你把你放进去的东西拿出来。如果你写了一个int,你就不能读一个字符串。在问题中发布写入代码和读取代码。

标签: c++ binaryfiles ifstream


【解决方案1】:
ifstream ifile; 
    ifile.open(fileName, ios::binary | ios::in |ios::ate);
    if(ifile.good()){
        char * buffer;
        long size;
        ifstream file (fileName, ios::in|ios::binary|ios::ate);
        size = file.tellg();
        file.seekg (0, ios::beg);
        buffer = new char [size];
        file.read (buffer, size);
    }
 }

我通过让它获得大小然后直接读取它来修复它。我还修复了如何为二进制文件写入写入的潜在问题。

【讨论】:

  • 首选std::vector,因为您的代码可能存在内存泄漏。
猜你喜欢
  • 2016-09-16
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2012-08-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多