从二进制文件输入字符串时出现未处理的异常视觉工作室

时间:2014-05-30 08:15:28

标签: c++ string unhandled-exception

好吧,如果我的问题看起来很愚蠢的话,我对此有点新意。

基本上,我试图从二进制文件中读取字符串 代码:

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:我检查了两个问题,而不是重复。

2 个答案:

答案 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() );