C++ 为什么我的类列表(在C+;+;)在尝试从文本文件输入值时抛出错误?

C++ 为什么我的类列表(在C+;+;)在尝试从文本文件输入值时抛出错误?,c++,class,linked-list,C++,Class,Linked List,我在处理一个链表。它是由班级组成的。当我尝试使用此函数将信息从文本文件导入列表的第一个指针时:(在底部更详细地描述我的文件层次结构和代码) 这是产品。h: #include <string> namespace std{ class product{ public: product(); string getName(); void setName(string s); float getPrice();

我在处理一个链表。它是由班级组成的。当我尝试使用此函数将信息从文本文件导入列表的第一个指针时:(在底部更详细地描述我的文件层次结构和代码)

这是产品。h:

#include <string>
namespace std{
    class product{
    public:
        product();
        string getName();
        void setName(string s);
        float getPrice();
        void setPrice(float p);
        int getAmount();
        void setAmount(int a);
    private:
        string name;
        float price;
        int amount;
    };
}
#包括
名称空间标准{
类产品{
公众:
产品();
字符串getName();
void setName(字符串s);
浮动价格();
无效设定价格(浮动价格);
int getAmount();
无效设定金额(INTA);
私人:
字符串名;
浮动价格;
整数金额;
};
}
My productList.cpp文件包括:

#include <iostream>
#include <fstream>
#include <iomanip>
#include "productList.h"
#include <iostream>
#include <array>
#include "productList.h"
#包括
#包括
#包括
#包括“productList.h”
我的product.cpp文件只包括product.h,而我的main.cpp文件(包含我的执行函数)包括:

#include <iostream>
#include <fstream>
#include <iomanip>
#include "productList.h"
#include <iostream>
#include <array>
#include "productList.h"
#包括

#包括

您应该在productList构造函数中初始化头以及其他节点*。假设您已经这样做了,while循环中存在一个明显的错误:

n = NULL;
n->products.setName(line);
第二行是取消对空指针的引用,这可能会导致访问冲突0xC0000005。0x18可能是从null到(不存在)节点对象vtable的偏移量,用于查找位置

要解决此问题,请移动该行:

Node* n = new Node;
n = NULL;
在while循环内,更换线路:

Node* n = new Node;
n = NULL;

请注意:这也修复了另一个错误,即循环意味着每次传递都要填充一个新节点,但原始代码只调用一次新节点。

@RetiredInja如果(!file.is_open())
检查?@Cheersandhth.-Alf我尝试添加了一个
getline(file,line)
头->产品.setName(行)。我真的认为这会起作用,或者至少改变我的错误,但我仍然得到了完全相同的错误。我已经添加了一个指向包含所有文件(包括txt文件)的zip文件的链接,这样您就可以自己测试这个程序。@RetiredInja该文件没有格式错误。@Beta我在这篇文章的底部添加了一个dropbox链接,允许您下载包含所有文件(包括文本文件)的zip文件这样你就可以自己测试这个程序了。互联网上到处都是被破坏的计算机,因为一些程序员认为,“我不必测试那个错误条件。”也有人认为,“当然,我会下载那个匿名zip文件。”如果我这样做,错误消息只会变为:“链表Inventory.exe中0x00195EFB处的未处理异常:0xC0000005:访问冲突读取位置0x00000018。”然后再次查看调用堆栈,找出导致问题的代码行。知道这一点将大大有助于解决问题。@RetiredInja它位于同一行(2245)。我不知道这意味着什么。callstack窗口(alt+7以显示它,尽管它通常默认显示)为您提供了一个函数列表,这些函数被调用以到达调试器现在所在的位置。您需要查看它并单击它显示您编写的函数的行,然后您就会知道代码的哪一部分被破坏了。