传递结构C 的动态阵列
Passing a dynamic array of structs c++
我需要读取一个 .txt
文件,然后将第一个数字用作名为 getData
的函数中的数组大小。
在我的代码中,我能够读取文件并将其分配给数组大小为listSize
。我还可以用.txt
信息填充其余的数组。当我打印出getData
函数中的数组中的内容时,它起作用。
问题是,当我尝试访问getData
功能外部的数组时,我的程序会崩溃。我是指针的新手,总体上是C 。我认为我不会传递它或正确地称其为正确。我很难找到信息来帮助我解决这个问题。
如何访问我在getData
中创建的数组?
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
struct menuItemType
{
string menuItem;
double menuPrice;
};
void getData(int& listSize, menuItemType menuList[], int orderList[]);
int main()
{
menuItemType *menuList = 0; //-----pointers
int *orderList = 0;
int listSize;
getData(listSize, menuList, orderList);
cout << menuList[0].menuItem; //-----This is what crashes the program
return 0;
}
//-----Get Menu Function
void getData(int& listSize, menuItemType menuList[], int orderList[])
{
//-----Declare inFile
ifstream inFile;
string price, size;
//-----Open inFile
inFile.open("Ch9_Ex5Data.txt");
//-----Get Amount of Items, Convert to int
getline(inFile, size);
listSize = stoi(size);
//-----Set Array Size
menuList = new menuItemType[listSize];
orderList = new int[listSize];
//-----Get Menu
for (int x = 0; x < listSize; x++)
{
//-----Get menuItem
getline(inFile, menuList[x].menuItem);
//-----Get menuPrice convert to double
getline(inFile, price);
menuList[x].menuPrice = stod(price);
}
//------PRINT WORKS HERE ----- This print made me think i created the
//arrays correctly
for (int x = 0; x < listSize; x++)
{
cout << menuList[x].menuItem << endl
<< menuList[x].menuPrice
<< endl;
}
inFile.close();
}
.txt
8
Plain Egg
1.45
Bacon and Egg
2.45
Muffin
0.99
French Toast
1.99
Fruit Basket
2.49
Cereal
0.69
Coffee
0.50
Tea
0.75
getData
中设置menuList
和orderList
的设置不会更新main
中的指针。如果您使用指针的引用:
void getData(int& listSize, menuItemType*& menuList, int*& orderList);
更好的是,使用std::vector
的引用,并用拥有指针和new
和delete
。
让我们重写您的代码以提供更好的C NESS,并提供说明。:(
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
不要仅仅因为您可以键入更少的内容而使用命名空间std,命名空间可以告诉您您调用的特定内容来自哪里。如果您真的想编写字符串而不是std :: string,请拉出特定的东西,而不是整个名称空间,例如:
using std::string;
您的结构似乎是正确的,但是您需要选择您的类型是否从首都开头,我总是从首都开始我的类型,但这是一个选择:
struct MenuItemType
{
string menuItem;
double menuPrice;
};
现在,您的GetData应该获取数据。因此类型很重要。您的数据并不是您所宣布的"无效",它是一系列的menuitemtype,然后您可以将它们声明为矢量,甚至不关心指针。
其他事情:getData中的所有参数都不应该是参数 - 它们都是您从文本文件中获得的所有内容,因此,您的程序将分析的内容,因此对于GetData来说,唯一重要的是文本文件,所以这是您的变量。
std::vector<MenuItemType> getData(const std::string& textFile)
{
std::ifstream inFile;
std::string price, size, item;
inFile.open(textFile);
getline(inFile, size);
int listSize = stoi(size);
std::vector<MenuItemType> result;
result.reserve(listSize);
for (int x = 0; x < listSize; x++)
{
getline(inFile, item);
getline(inFile, price);
result.push_back(MenuItemType{item, stod(price)});
}
return result;
}
看看我没有关闭文件?它将在您离开功能后立即关闭,除非您需要在功能完成之前关闭文件,否则无需致电。
大拇指规则:除非您必须处理。
至于您的主要功能:
int main()
{
std::vector<MenuItemType> menuList = getData("Ch9_Ex5Data.txt");
cout << menuList[0].menuItem;
return 0;
}
您可以以更快的速度重写,如果您确定使用了哪种类型,上面的代码等效于此:
int main()
{
auto menuList = getData("Ch9_Ex5Data.txt");
cout << menuList[0].menuItem;
return 0;
}
- 基于用户输入的 2D 动态阵列
- 2D 动态阵列被视为特洛伊木马?
- C 动态阵列在类中
- 将动态阵列中的字符与char进行比较
- C++ 清除动态阵列中的内存 - 内存无法清除
- 传递结构C 的动态阵列
- 结构的动态阵列
- 将指针或一系列指针存储在动态阵列中
- C 静态数组,例如动态阵列
- 指针的C 动态阵列
- 存储矢量中的动态阵列
- 动态阵列[C ]的驱动器
- C++动态阵列索引和容量问题
- 分段错误(核心转储)动态阵列
- C 排序字符串的动态阵列 - 排序不起作用
- 将一维动态阵列反转为n维
- 将指针添加到成员对象中的指针动态阵列
- MEMSET FUCTION在我的C 动态阵列初始化中不起作用
- C 填充动态阵列int
- 复制动态阵列并使用过载的操作员删除原件