2013-07-12 140 views
0

我想創建一個應用程序的學生經理。我想要用戶輸入一個名字和年齡的學生的信息,然後應用程序將它保存在一個文件中。我可以爲我的應用程序保存它,但如何閱讀它?這是我的代碼,它可以讀取文件中的所有信息,但第一個學生除外。我不知道爲什麼?如何逐行讀取字符串

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

using namespace std; 

struct St 
{ 
    string name; 
    int age; 
}; 

class StManager 
{ 
    int n; 
    St *st; 
public: 
    StManager() 
    { 
     n = 0; 
     st = NULL; 
    } 
    void input(); 
    void output(); 
    void readfile(); 
    void writefile(); 
}; 

void StManager::input() 
{ 
    cout << "How many students you want to input?: "; 
    cin >> n; 
    st = new St[n]; 
    for(int i=0; i<n; i++) { 
     cout << "Input student #"<<i<<":"<<endl; 
     cout << "Input name: "; 
     cin.ignore(); 
     getline(cin, st[i].name); 
     cout << "Input age: "; cin>>st[i].age; 
     cout <<endl; 
    } 
} 

void StManager::writefile() 
{ 
    ofstream f; 
    f.open("data", ios::out|ios::binary); 
    f<<n; 
    f<<endl; 
    for(int i=0; i<n; i++) 
     f<<st[i].name<<setw(5)<<st[i].age<<endl; 
    f.close(); 
} 

void StManager::readfile() 
{ 
    ifstream f; 
    f.open("data", ios::in|ios::binary); 
    f >> n; 
    for(int i=0; i<n; i++) { 
     getline(f, st[i].name); 
     f>>st[i].age; 
    } 
    f.close(); 
} 

void StManager::output() 
{ 
    for(int i=0; i<n; i++) { 
     cout << endl << "student #"<<i<<endl; 
     cout << "Name: " << st[i].name; 
     cout << "\nAge: " << st[i].age; 
    } 
} 

int main() 
{ 
    StManager st; 
    st.input(); 
    st.writefile(); 
    cout << "\nLoad file..."<<endl; 
    st.readfile(); 
    st.output(); 
} 
+1

請使用'std :: vector'而不是'new []'。你至少有內存泄漏。並查閱「C++ getline跳過」,因爲這也是一個問題。 – chris

+0

@chris:爲什麼是矢量?對不起,我是C++的新手,我不明白 –

+0

說實話,應該在指針之前將它教給你用來學習的任何書籍或資源中的動態數組。有很多關於如何使用'std :: vector'的例子,以及它爲什麼讓生活變得更好。 – chris

回答

0

您的input()功能沒問題。問題在於你正在調用readfile()函數 - 這是沒有意義的,因爲你已經加載了一次輸入數據。您的readfile()不會調用ignore(),導致它覆蓋您以前擁有的正確數據。

+0

oK,非常感謝你;) –