好吧,如果我的问题看起来很愚蠢的话,我对此有点新意。
基本上,我试图从二进制文件中读取字符串 代码:
using namespace std;
fstream words;
words.open("Data/words.bin", ios::binary | ios::in);
string s;
words.read((char*)&s, sizeof(string));
cout << s;
words.close();
编译这会给我以下错误:
Unhandled exception at 0x0FABDF58 (msvcp120d.dll) in HangMan.exe: 0xC0000005: Access violation reading location 0x052DE6EC.
然而,它会在抛出错误之前将字符串打印到控制台。
写入文件不会导致任何类型的错误,也不会读取char []。只有在读入字符串时才会出现此问题。
编辑:
我知道将字符串*转换为char *并不是一个好主意,但我现在明白了。它只是下面的代码工作,所以我假设使用一个字符串也可以工作:
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
class foo
{
private:
int X;
int Y;
int Z;
char C;
public:
foo(int x,int y,int z, char c): X(x), Y(y), Z(z), C(c){}
void display()
{
cout<<X<<endl<<Y<<endl<<Z<<endl<<C<<endl;
}
};
int main()
{
fstream out;
out.open("file.bin", ios::binary | ios::out);
foo var(1,2,3,'a');
out.write((char*)&var,sizeof(foo));
cout<<"var: \n";
var.display();
out.close();
cout<<"var2 before reading: \n";
foo var2(0,0,0,'z');
var2.display();
fstream in;
in.open("file.bin", ios::binary|ios::in);
in.read((char*)&var2,sizeof(foo));
cout<<"var2 after reading: \n";
var2.display();
return 0;
}
如果我理解正确,这不应该是正确的吗?
@Rakibul Hasan:我检查了两个问题,而不是重复。
答案 0 :(得分:1)
您正在将string*
投射到char*
,这是无效的。
答案 1 :(得分:1)
从string
投射到char*
这是一个非常糟糕的主意:
string s;
words.read((char*)&s, sizeof(string));
您需要先分配内存。如果您想一次性读取文件(仅适用于小文件):
size_t fileSize = words.seekg( 0, std::ios::end ).tellg() - words.seekg( 0 ).tellg();
std::vector<char> buf( fileSize );
words.read( &buf[0], buf.size() );