【问题标题】:C++ - Exception thrown: read access violation. Variable was nullptrC++ - 抛出异常:读取访问冲突。变量为 nullptr
【发布时间】:2016-08-01 10:49:50
【问题描述】:

我有一个程序可以从文件夹中读取不同位置的文件。成功读取文件后,我将文件的 ifstream 变量分配给临时变量。下面的代码是一个例子:

while (!CBAsales.eof())
    {
        string sFilePath = "Datafolder/CBA/";
        sFilePath = sFilePath.append(sFileName);
        // Read the csv file
        infile.open(sFilePath);
        if (!infile)
        {
            cout << sFileName << ": File not found!!!" << endl;
            exit(1);
        }

        while (getline(infile, record, '\n'))
        {
            while (!infile.eof())
            {
                if (record.size() > 0)
                {
                    //insert elements here
                }
            }
        }
        infile.close();
        mapIAG.insert(pair<string, Vector<Stock>>(sFileName, V1));
        }

    CBAsales.clear();
    CBAsales.seekg(0, ios::beg);
    tempSales = &CBAsales;
}

这是文件的读取。现在您可以看到 tempSales = &CBAsales;它被分配给一个临时变量。我在全局范围内声明了这些变量,并且有一个指向 tempSales 的指针,如下所示。

ifstream codeindex;
ifstream IAGsales;
ifstream CBAsales;
ifstream NABsales;
ifstream * tempSales;
ifstream infile;

这里是我显示所有必要记录的地方:

cout << "Enter date of transaction" << endl;
while (!tempSales->eof())
{
    getline(*tempSales, record);
    cout << record << endl;
}

这是我得到的错误:http://i.imgur.com/I9lv2zv.png

为什么即使分配了它也指向null?我是不是用错了指针?

【问题讨论】:

  • @RichardHodges 我尽量让它尽可能简约。 sn-p 与我的问题相关,因此我添加了这些代码行。
  • 最小的意思是提供一个完整的 10 行程序,表现出相同的行为,所以我们可以重现它!
  • 使用调试器怎么样?处理异常总是一个好的开始,它可以帮助您通过代码跟踪错误...
  • @Bentoy13 好吧,我确实使用了调试器,这就是我生成屏幕截图中给出的错误的方式。

标签: c++


【解决方案1】:

你的循环没有意义。如果我们只考虑相关变量,它就相当于代码

while (!CBAsales.eof())
{
    CBAsales.clear();
    CBAsales.seekg(0, ios::beg);
    tempSales = &CBAsales;
}

CBAsales 在第一个测试中位于文件末尾,这意味着循环中的代码永远不会执行或循环永远执行。

如果循环从不执行语句tempSales = &amp;CBAsales; 从不执行并且tempSales 初始值不变。

【讨论】:

  • 循环有什么不好的地方?我正在从头到尾检查 CBA 文件,然后将向量的所有元素分配给tempSales。我哪里做错了?
  • 您的循环没有进展。在修改不相关的对象时,您正在循环 CBAsales 的状态。正如我在回答中所说,如果你只保留影响 CBAsales 的对象,你就会有一个无限循环或一个永远不会执行的循环。这是错误的。
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 2022-12-20
  • 2020-09-12
  • 2023-04-02
  • 1970-01-01
  • 2018-05-19
  • 2020-04-15
  • 2019-09-09
相关资源
最近更新 更多