传递结构C 的动态阵列

Passing a dynamic array of structs c++

本文关键字:动态 阵列 结构      更新时间:2023-10-16

我需要读取一个 .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中设置menuListorderList的设置不会更新main中的指针。如果您使用指针的引用:

void getData(int& listSize, menuItemType*& menuList, int*& orderList);

更好的是,使用std::vector的引用,并用拥有指针和newdelete

让我们重写您的代码以提供更好的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;
}