2017-04-23 330 views
1

我需要读取.txt文件并将第一个数字用作函数getData中的数组大小。传递结构的动态数组C++

在我的代码中,我能够读取文件并将其指定为数组大小为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(); 
} 

getData设置menuListorderList的的.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 
+0

传递指向数组中第一个元素的指针以及一个表示数组大小的整数。 '通过(StructArray * sa,int sizeArray)' –

回答

1

内容不main更新指针。请将您使用的指针引用:

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

更妙的是,使用引用std::vector并退出与所拥有的指针和newdelete周围搞混。

+0

谢谢!我一直被卡住的时间比id还要承认。 –

1

让我们用一个更好的C++重写你的代码,并加以解释。 :)

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string> 

不要做使用空间std,只是因为你可以输入更少的东西,命名空间,告诉你,你调用这个特别的事情是从哪里来的帮助你。如果你真的想写入字符串,而不是的std :: string,拉那特别的事情,而不是整个命名空间,就像这样:

using std::string; 

你的结构似乎是正确的,但你需要选择,如果你的类型将与首都启动还是不行,我总是开始我的类型的资本,但是这是一个选择:

struct MenuItemType 
{ 
    string menuItem; 
    double menuPrice; 
}; 

现在,你应该的getData,好,让您的数据。所以类型很重要。你的数据不是'你'声明的'void',它是一个MenuItemType数组,你可以将它们声明为vector,甚至不关心指针。

其他的事情: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; 
} 
+0

优秀信息!谢谢,我目前是一名学生,我们正在讨论结构,指针,函数等等。我们还没有得到载体。你在我的代码中看到的是关于我的知识程度。像你这样的评论可以帮助我进步,谢谢! –

+0

不客气。一件事,目前教现代C++的方法是留下一些高级主题,比如稍后指出,当学生更好地接受语言时。 –