2014-10-21 60 views
0

我无法理解如何创建指向结构体的指针数组。我试图在论坛上查找类似的例子和主题,但我仍然无法让我的代码工作!因此,我相信我写了一段丑陋的代码,我不知道它出错的地方以及如何解决它。 下面是代码:创建指向结构体的指针数组

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

using namespace std; 

struct Movie 
    { 
     string name; 
     int numawards; 
     int nomination; 
     int year; 
    }; 

void *readfile(ifstream &infile, int &n); 

int main() 
{ 
    ifstream infile; 
    int n = 0; 
    infile.open("old_movies.txt"); 
    Movie *oldmovies; 
    oldmovies = readfile (infile, n); 

    return 0; 

} 
//*function documentation// 
void *readfile (ifstream &infile, int &n) 
{ 

    infile >> n; 
    Movie *movies; 
    movies = new Movie[n]; 
    for (int i = 0 ; i < n ; i++) 
    { 
     infile >> movies[i]->year >> movies[i]->numawards >> movies[i]->nomination; 
     infile.ignore(); 
     infile.ignore(); 
     getline(infile, movies[i]->name); 

     cout << movies[i]->year << " " << movies[i]->numawards << " " << movies[i]->nomination << " " << endl << movies[i]->name<< endl; //the cout here is to test and see if the code works. 
    } 
    return movies; 
} 

这段代码的目的是为了读取包含电影名称的txt文件,有多少奖项,怎么可能会提名,并哪一年生产,然后把它打印出来使用指针。下面是该文件的样子:

2 
1935 1 3 

The Dark Angel 

1935 4 6 

The Informer 

1935 1 8 

前4位代表年份,第二个代表它已经得到了多个奖项,最后一个数字代表它已经被提名到获奖的次数。

无论如何,我被困在这部分,我真的无能为力在这里做什么。我只希望这个代码没有那么糟糕,以至于有很多事情需要改变。任何帮助或建议将不胜感激。

+2

您声明'Movie * oldmovies;'但使用赋值'oldmovies = readfile(infile,n);'填充数组,但函数具有签名'void * readfile(ifstream&infile,int&n)'。它被声明返回'void',但你试图在函数结尾处返回电影。 – CoryKramer 2014-10-21 22:54:14

+0

考虑在使用它们之前定义函数。优势:无需前瞻性声明。另外,请不要在'istream&'足够的地方使用'ifstream&'参数(并且在使用读取值之前检查您是否成功读取*)。接下来,避免使用'namespace std;',尽管至少它不在标题中。最后,'main'中的'return 0;'是多余的。 – Deduplicator 2014-10-21 23:02:45

+0

附录:避免线路过长,特别是在互联网上发布时。 80个字符绰绰有余。 – Deduplicator 2014-10-21 23:05:18

回答

0

让我们看看你有什么在这里:

Movie *movies; 
movies = new Movie[n]; 

这种分配Movie实例的数组。动态分配数组的指针,你需要这里面现在改为

Movie** movies; 
movies = new Movie*[n]; 

for循环,你需要分配每个Movie实例:

movies[i] = new Movie(); 

你也应该改变readfile()返回一个Movie**而不是一个void*,以便您以后不必使用任何演员。

但是你真的需要一个指针数组吗?为什么不只是使用一个结构数组。这将避免额外的间接级别,并使代码变得简单一些。

+0

是的,我真的这么做,因为这个任务是我需要使用指针的。如果我有选择不使用指针,我会不会使用它。谢谢您的帮助! – CowEatsGrass 2014-10-21 23:00:17

+0

和最后一句之前的第二句话,你说“改变readfile()返回一个电影** ...”你能解释一下吗,因为我仍然是这个领域的noob,所以我在这里很困惑。 – CowEatsGrass 2014-10-21 23:07:06

+0

@CowEatsGrass“使用指针”不同于“使用指针数组” – 2014-10-21 23:21:37