我正在尝试打开一个文件并将其放入一个字符串中。我的代码是:
#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
答案 0 :(得分:1)
std::string someString(memblock);
应该是
std::string someString(memblock, size);
构造函数的前一版本创建someString
将memblock
视为C样式字符串,该字符串终止于值为0
的第一个字节。这可能最终导致字符串太短;对于其他文件内容,您最终可能会超出您分配的内存。
后一版本使用someString
的完整内容创建memblock
,包括任意0
字节。
答案 1 :(得分:1)
std::string someString(memblock);
这里你使用的字符串构造函数接受const char*
并读取直到第一个空字节,因为它没有其他方法可以知道要读取多少字节。
相反,使用字符串构造函数精确读取您告诉它的字节数,而不管字节的值是什么:
std::string someString(memblock, size);