2015-04-02 36 views
-2

我有一個結構:如何要求輸入一次初始化多個結構

struct Student { 
    string name; 
    int CWID; 
    float GPA; 
}; 

現在,我有5個學生的數組:

Student* s = new Student[5]; 

現在我要對它們進行初始化使用控制檯輸入以這種形式:

John 5.5 
Mike 5012432 3.6 
Ryan 5013521 3.3 
Mary 5012784 4.0 
Harry 5012695 3.1 

我的瑣碎的邏輯是:

for (int i = 0; i < 5; i++) { 
     cout << "\n\nPlease enter Student " << (i + 1) << "'s details (Name, CWID, GPA): "; 
     cin >> s[i].name >> s[i].CWID >> s[i].GPA; 
} 

與其單獨詢問5個輸入,我怎樣才能一次全部使用它們?

+0

除了提示之外,一次不應該有任何區別。順便說一句,如果你知道數組的大小,使用一個數組(如果可以的話,可以使用'std :: array')。如果你不這樣做,請使用'std :: vector'。不要使用'new []'。 – chris 2015-04-02 20:21:48

+0

從文件中讀取輸入時如何? – 2015-04-02 20:23:41

+0

如何在從文件讀取數據時搜索StackOverflow以獲取答案?試試這個:[「stackoverflow C++ read file structure」](https://www.google.com/search?q=stackoverflow+c%2B%2B+read+file+structure&ie=utf-8&oe=utf-8) – 2015-04-02 21:16:18

回答

1

而不是分別詢問5個輸入,我怎樣才能一次拿走它們?

使用控制檯輸入輸入是如此的老派。

  1. 將數據放入文件中。

  2. 擺脫程序中用戶輸入的提示。

  3. 使用該文件作爲輸入源。


for (int i = 0; i < 5; i++) { 
    cin >> s[i].name >> s[i].CWID >> s[i].GPA; 
} 

用法:

./program < input.txt 
+0

請解釋完整的代碼,如ifsteam和所有。 – 2015-04-02 20:30:24

+0

@B-Mac,這裏沒有涉及「ifstream」。當像我所示的那樣使用時,'input.txt'的內容可以從'cin'中讀取。 – 2015-04-02 20:32:49

0

你可以只取出cout,並將其放置在循環外。

cout << "\n\nPlease enter Students' details (Name, CWID, GPA): \n"; 
for (int i = 0; i < 5; i++) { 
     cin >> s[i].name >> s[i].CWID >> s[i].GPA; 
} 

實際上沒有什麼不同;這只是你看待事物的方式。不過,您也許想使用files。如果您總是需要一定的數值​​,它可能會爲您節省一些時間。

+0

我知道'cin >>'跳過前導空格,但它是否也跳過換行符?如果沒有,我會在每個循環迭代中使用'std :: getline()',並使用'std :: istringstream'將行內容流式傳輸到當前結構中。 – 2015-04-02 21:07:33

+0

@RemyLebeau,換行符被認爲是空白。例如,'std :: isspace('\ n')!= 0' – chris 2015-04-02 22:04:04