2014-10-21 88 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