所以我有这个ifStream,它从文件中读取正常。我读了一行是为了检查我正在读的项目的类型。然后在我读完之后我将流传递给另一个读更多的类,但是当它到达这个类时它会抛出这个异常。访问冲突读取位置0x00000014。 以下是显示此错误的代码。
void Author::readData(ifstream & stream1)
{
string line = "";
getline(stream1, name); //The error happens here
if (stream1.fail() && stream1.eof())
{
throw Error(-1);
}
else if (stream1.fail() && !(stream1.eof()))
{
throw Error(0);
}
getline(stream1, address);
if (stream1.fail() && stream1.eof())
{
throw Error(-1);
}
else if (stream1.fail() && !(stream1.eof()))
{
throw Error(0);
}
}
void Book::readData(ifstream & stream1)
{
(*theAuthor).readData(stream1); //This is where the function is called. Let me check to see if It is even initialized here.
if (stream1.fail() && stream1.eof())
{
throw Error(-1);
}
else if (stream1.fail() && !(stream1.eof()))
{
throw Error(0);
}
getline(stream1, title);
if (stream1.fail() && stream1.eof())
{
throw Error(-1);
}
else if (stream1.fail() && !(stream1.eof()))
{
throw Error(0);
}
我已经对许多不同的网站进行了研究,但我似乎找不到任何解释为什么ifstream会抛出此异常的原因。请帮忙。
编辑:添加了一些代码,希望它可能会有所帮助。
答案 0 :(得分:1)
显示的代码没有任何问题。
你读过的所有网站都没有完全向你解释,只是因为C ++程序在特定行上崩溃并不意味着bug就在哪里。我可以很容易地得出一个最小的例子strcpy()
超过数组的末尾,破坏堆栈,然后继续做一堆工作,并且只有在尝试从函数返回时崩溃。 C ++中的return
语句没有任何问题,但代码将在那时崩溃。
您的getline()
电话或其使用方式也没有任何问题。
编程错误或错误通常会导致内存损坏,但在整个内存中踩踏后,代码可能不会立即尝试以任何有意义的方式使用它,而是继续前进。稍后在某个指针处,程序返回并尝试使用其数据结构,遇到垃圾和崩溃。
最可能的解释是,之前发生的错误最终会在您的std::ifstream
和/或名称std::string
上涂鸦。现在,您可以调用getline()
来从流中读取此字符串,然后代码就会爆炸。或者,也许某些东西搞砸了指向这个Author
类的实例的指针。尝试执行此类方法。代码爆炸,因为name
类成员显然是完全垃圾。当然,错误不会在这里,但无论指向这个Author
类的指针被搞砸了。
你可以获得问题帮助的唯一方法就是你发布minimum, complete, and verifiable example任何人都可以编译,执行和重现你的bug(注意“最低”要求,这并不意味着您可以发布整个代码。)
您需要调查整个程序的其余部分,查找您的错误。欢迎来到C ++。