首页 > 解决方案 > 在 C++ 中将数据从文件馈送到动态分配的数组

问题描述

所以,我正在做一个大学作业,基本上需要的是你使用一个指针,该指针指向一个基于数据文件输入的正确大小的动态分配数组。问题是,当程序运行时,我不断收到不同的错误。该程序编译得非常好,但是当它运行时,它给了我这个:“0xC0000005:访问冲突读取位置0xFDFDFDFD。”

这是我正在使用的代码(请注意,一些代码是由我的教授编写的,在你问之前,我试图联系他,但从未从他那里得到任何回复):

由教授撰写

struct emprec   /*Employee record with two fields*/
{
    int id;
    float salary;
};
typedef emprec* emprecptr; /*Employee record pointer type*/
typedef emprecptr* indexarr; /* Pointer to a dynamic array of employee record pointers*/

我写的

void readdata(indexarr& ptrs, int& size)
{
    size = 0;

    ptrs = nullptr;
    ptrs = new emprecptr[size];
    ifstream in;
    in.open("p1data.txt");
    if (!in) {
        cout << "Unable to open p1data.txt"; //if the file is not in the folder
        exit(1);
    }
    while (!in.eof()) {
        in >> ptrs[size]->id;        //putting to read line for id
        in.ignore();
        in >> ptrs[size]->salary;       //putting to read line for salary
        in.ignore();
        size = size + 1;

    }
    in.close();
};

标签: c++

解决方案


size = 0;

ptrs = nullptr;
ptrs = new emprecptr[size];

这设置size为 0,然后使用new包含size值创建一个数组。由于为 0,这将创建一个包含精确值size的数组。0

ptrs是一个完全空的数组(顺便说一下,对 a 的第一个赋值nullptr并没有做任何有用的事情)。

    in >> ptrs[size]->id;        //putting to read line for id

然后显示的代码继续并尝试将数据放入此数组中。但是这个数组是完全空的。它的大小为零。它不包含任何内容,因此不会走得太远,并且您的程序会崩溃。

即使不是这样,也ptrs只是一个指针数组。即使假设这个数组本身是正确分配的,它们也绝对没有指向任何东西,直到你实际上new也有这些指针。

    size = size + 1;

看起来你相信仅仅因为你size在这里递增,并且它在程序中早些时候被用于new一个数组,这一定意味着这个数组也会自动增长一个值。这不是真的。C++ 不能以这种方式工作。您的 C++ 程序完全按照您的要求执行,一次一个语句。您的程序new是一个给定大小(零大小)的数组。这就是发生的事情。结束。在您实现执行此操作的代码之前,该数组不会再发生任何事情。

您的家庭作业要求您实现智能、复杂的内存管理,并充分了解内存管理在 C++ 中的工作原理。您需要实现适度复杂的逻辑,首先创建一个合理大小的数组,一个由十个或二十个指针组成的数组(自己选择一些合理的数字),然后一次读取一条记录,new-ing 每个新记录(显然),并且将new指向它的 ed 指针保存在此数组中。如果数组变满了,就需要new一个更大的数组,把所有的指针从更小的数组复制到更大的数组,delete更小的数组,然后继续读取,直到所有的记录都读完。

我假设您的分配要求您动态增长间接指针数组。这不是很清楚,但您可能只需要自己动态增长记录数组。如果是这样,这将变得稍微简单一些,但基本方法将是相同的。

while (!in.eof()) {

哦,这也是一个令人讨厌的错误,您也需要修复


推荐阅读