c++ - 在 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();
};
解决方案
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()) {
推荐阅读
- ios - 在 xcode 中设置 C 编译标志
- cakephp-3.0 - Cakephp 3:在视图中管理翻译异常的最佳实践是什么?
- javascript - 在对象数组中查找匹配 ID 的最佳方法?
- go - 将 CSV 文件服务器发送到客户端
- variables - 在 Kotlin 中,是否可以使用变量来调用方法或属性?
- c++ - Google Mock:无法设置操作或用户 SaveArg 功能
- sql - 如何使用 TIMEZONE 列获取时间戳(4)的前一小时?
- javascript - 如何在 gulp 任务中运行 shell 命令并检测它何时完成?
- javascript - FizzBuzz 只打印可被三整除的数字
- jquery - 从数据库中检索完整的日期时间并在 MVC 中的视图中显示