繁体   English   中英

传递结构的动态数组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中设置menuListorderList不会更新main的指针。 如果您使用了对指针的引用,它将:

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

更好的是,使用对std::vector引用,并通过拥有指针以及newdelete摆脱混乱。

让我们通过解释来重写您的代码,以获得更好的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM