当我尝试从文本文件输入值时,为啥我的类列表(在 C++ 中)会引发错误?

Posted

技术标签:

【中文标题】当我尝试从文本文件输入值时,为啥我的类列表(在 C++ 中)会引发错误?【英文标题】:Why is My List of Classes (in C++) Throwing an Error when I Try to Input Values from a Text File?当我尝试从文本文件输入值时,为什么我的类列表(在 C++ 中)会引发错误? 【发布时间】:2015-05-21 23:52:12 【问题描述】:

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

void productList::readInProducts()
    ifstream file;
    string line = "";

    cout << "What's the name of the file you would like to open?" << endl;
    getline(cin, input);//string input is in productList and shared between this function and writeOutProducts()
    file.open(input);

    if (!file.is_open())
    
        cout << "Cannot open " << input << endl;
        return;
    
    head->products.setName(line);
    getline(file, line);
    head->products.setPrice(stof(line));
    getline(file, line);
    head->products.setAmount(stoi(line));
    getline(file, line);
    while (!file.eof())
    
        Node* n = new Node;
        n->products.setName(line);
        getline(file, line);
        n->products.setPrice(stof(line));
        getline(file, line);
        n->products.setAmount(stoi(line));
        getline(file, line);
        current = current->next;//make the current pointer point to the next node in the list
        current->next = n; //Set the current (empty) node equal to the n which contains three lines from the file
    

我收到此错误:

然后visual studio打开(我假设是一个CPP)名为xstring的文件,其中有一个指向第2245行的中断箭头。

现在让我更详细地解释一下我的代码。我有五个文件:productList.h、productList.cpp、product.h、product.cpp 和 main.cpp。这是productList.h:

#include "product.h"
namespace std
    class productList
    public:
        productList();
        void addAProduct();
        void changeInventory();
        void printProducts();
        void readInProducts();
        void writeOutProducts();
    private:
        short count;
        string input; //Used to share the input between the read & write functions
        product products[200];
        struct Node
            product products;
            Node* next;
        ;
        Node* head;
        Node* current;
        Node* temp;
        Node* tail;
    ;

这是product.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;
    ;

我的 productList.cpp 文件包括:

#include <iostream>
#include <fstream>
#include <iomanip>
#include "productList.h"

我的 product.cpp 文件只包含 product.h,而我的 main.cpp 文件(包含我的执行函数)包含:

#include <iostream>
#include <array>
#include "productList.h"

虽然这些关系看起来有些复杂,但它们都应该是有效的。 cpp 文件以完全相同的名称链接到它们的头文件(假设头文件存在),同时 main.cpp 链接到 productList.h,productList.h 链接到 product.h。我看不出我的代码做错了什么——尽管这可能只是因为我很难这样准确地理解指针是如何工作的。我想错误在我的 productList::readInProducts() 函数的代码中,但我不知道出了什么问题。

你们可以提供的任何帮助将不胜感激,因为我很难过。 这是所有文件的保管箱链接: https://www.dropbox.com/s/9welj7k0yy2i1zj/productList.zip?dl=0

【问题讨论】:

@RetiredNinja 你错过了if (!file.is_open()) 支票吗? @Cheersandhth.-Alf 我尝试在head-&gt;products.setName(line); 之前添加getline(file, line);。我真的认为这会起作用,或者至少改变我的错误,但我仍然得到完全相同的错误。我已经包含了一个指向包含所有文件(包括 txt 文件)的 zip 文件的链接,以便您可以自己测试这个程序。 @RetiredNinja 该文件没有格式错误。 @Beta 我在这篇文章的底部添加了一个 Dropbox 链接,它允许您下载包含所有文件(包括文本文件)的 zip 文件,以便您自己测试这个程序. 互联网上充斥着损坏的计算机,因为某些程序员认为“我不必测试那种错误情况”。也因为有人想,“当然,我会下载那个匿名 zip 文件。” 【参考方案1】:

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

n = NULL;
n->products.setName(line);

第二行是取消引用一个空指针,它会给出 0xC0000005,访问冲突。 0x18 可能是从 null 到(不存在的)Node 对象的 vtable 的偏移量,正在寻找位置。

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

Node* n = new Node;

在while循环中,替换行:

n = NULL;

请注意:这还修复了另一个错误,即循环旨在通过每次传递填充一个新节点,但原始代码仅调用一次新节点。

【讨论】:

如果我这样做,错误消息会简单地更改为:“链接列表 Inventory.exe 中 0x00195EFB 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000018。” 再一次查看调用堆栈,找出导致问题的代码行。知道这将大大有助于解决问题。 @RetiredNinja 它在同一行(2245)。我不知道那是什么意思。 调用堆栈窗口(alt+7 显示它,尽管它通常默认显示)为您提供了一个函数列表,这些函数被调用以到达调试器现在所在的位置。您需要查看它并单击它显示您编写的函数的行,然后您就会知道代码的哪一部分被破坏了。

以上是关于当我尝试从文本文件输入值时,为啥我的类列表(在 C++ 中)会引发错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 C 结构在输入中没有得到任何数据?

当并行用户输入文本字段值更改下拉值时,应自动更改

从列表<T> c#写入文本文件

如何使用zend框架2在更改下拉值时在输入字段内显示值

为啥列表视图不显示用户输入的文本

当我尝试按标签获取文本字段的值时应用程序崩溃