[英]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 ++。 :)
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.