2015-09-01 64 views
1

我是C++的初學者。我正在編寫一個簡單的程序,創建student_info的記錄。我創建了一個包含成員變量名稱和作業成績矢量的structs數組。我希望從終端輸入cin讀入這個structs的數組中。請在下面找到我試圖做到這一點。我感到困惑的是如何在運行程序時終止/退出程序中的讀循環。我需要繼續閱讀姓名和一系列作業成績,形成一個單一的記錄。如果我刪除is.clear(),那麼當我輸入程序退出的下一個學生的姓名時,它只會獲得一條記錄。從cin讀取結構數組時終止輸入

我將不勝感激任何建議。

#include <cstdlib> 
#include <string> 
#include <iostream> 
#include <vector> 
using namespace std; 

struct student_info{ 
    string name; 
    vector<double> hw_grades; 
}; 

istream& read_single_record (istream& is, student_info& s){ 
    is>>s.name; 
    double x; 
    while(is>>x) 
    { 
    s.hw_grades.push_back(x); 
    } 
    is.clear(); 
    return is;} 

int main() { 
    //read data into an array of student info 
    vector<student_info> vec_st_info; 
    student_info x; 
    while(read_single_record(cin,x)) 
    { 
    vec_st_info.push_back(x); 
    }    
    return 0; 
    } 

爲節目A樣本輸入將是

John 
88 
98 
89 
67 
Sam 
78 
90 
Tom 
89 
90 
76 

名稱隨後功課等級每一個「返回」鍵輸入的序列。作業成績的數量也不固定。

+1

您需要一些實際的邏輯來確定記錄何時完成。例如,如果格式是將一條記錄中的所有值輸入到一行中,則應該使用'std :: getline',然後使用'std :: istringstream'從字符串中讀取。如果所有的值都在不同的行上,並用空行分隔,那麼在這種情況下'std :: getline'會再次起作用。如果結束記錄的成績有一個哨兵值(例如'-1'),請確保您正在處理該記錄。否則,您可能需要一次讀取一個字符,並在字符看起來不像數字時放回該字符。 – paddy

+0

感謝您的評論。這是Accelerated C++中代碼的簡化版本,我沒有更改代碼的任何結構細節。我沒有看到他們正在使用任何特殊檢查來確定記錄何時完成。有什麼方法可以說分配一個字符或輸入cmd + D表示記錄已完成 – Prag1

+0

如果在問題中包含示例以準確顯示輸入的內容,這將有所幫助。 – paddy

回答

0

這應該返回時您無法讀取name固定:

istream& read_single_record (istream& is, student_info& s) 
{ 
    if(!(is>>s.name)) return is; 
    double x; 
    while(is>>x) 
    { 
    s.hw_grades.push_back(x); 
    } 
    is.clear(); 
    return is; 
} 

這解決的竅門是因爲當你無法讀取的字符串流仍處於錯誤狀態的原因。之前,你總是在返回之前清除狀態。