使用ifstream加载文件时出错

时间:2013-12-11 22:52:25

标签: c++ file fstream

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

#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;
}

问题是它不会加载大部分只有一小部分“ýýýý«««««««««îþ”。 我用notepad ++打开时尝试的文件看起来像Notepad++ http://gyazo.com/9d8dc182d5dfa06610372462831cca0e.png

2 个答案:

答案 0 :(得分:1)

std::string someString(memblock);

应该是

std::string someString(memblock, size);

构造函数的前一版本创建someStringmemblock视为C样式字符串,该字符串终止于值为0的第一个字节。这可能最终导致字符串太短;对于其他文件内容,您最终可能会超出您分配的内存。

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

答案 1 :(得分:1)

std::string someString(memblock);

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

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

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

std::string someString(memblock, size);