【问题标题】:Error loading file with ifstream - only a small part is loaded使用 ifstream 加载文件时出错 - 仅加载了一小部分
【发布时间】:2013-12-11 22:52:24
【问题描述】:

我正在尝试打开一个文件并将其放入一个字符串中。我的代码是:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  streampos size;
  char * memblock;

  ifstream file ("C:\\a\\test.snt", ios::in | ios::binary | ios::ate);
  if (file.is_open()){

    size = file.tellg();
    memblock = new char [size];
    file.seekg (0, ios::beg);
    file.read (memblock, size);
    file.close();

    std::string someString(memblock);

    if(file.bad()){cout << "Bad\n";}
    if(file.fail()){cout << "Fail\n";}

    delete[] memblock;
  }else{ cout << "Unable to open file";}

  return 0;
}

问题是它不会加载大部分仅有的一小部分,例如“ýýýý««««««««îþîþ”。 当我用记事本++打开时,我尝试的文件看起来像这样
(来源:gyazo.com

【问题讨论】:

    标签: c++ file fstream


    【解决方案1】:
    std::string someString(memblock);
    

    应该是

    std::string someString(memblock, size);
    

    构造函数的前一个版本创建someString,将memblock 视为C 风格的字符串,该字符串在第一个字节处终止,值为0。这最终可能会创建太短的字符串;对于其他文件内容,您最终可能会读取超出分配的内存。

    后一个版本使用memblock 的完整内容创建someString,包括任何0 字节。

    【讨论】:

      【解决方案2】:
      std::string someString(memblock);
      

      这里您使用的是字符串构造函数,它接受 const char* 并读取到第一个空字节,因为它没有其他方法可以知道要读取多少字节。

      • 在您的二进制文件中,其中一个空字节很早就出现了。
      • 如果您的文件没有空字节,则字符串构造函数会继续读取甚至超出您分配的内存,从而导致危险和灾难。

      相反,请使用字符串构造函数来精确读取您告诉它的字节数,而不管字节的值是什么:

      std::string someString(memblock, size);
      

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        相关资源
        最近更新 更多