2015-05-31 49 views
-1

這是作業,我已經開發了我自己的大部分。 我只是不斷得到一個奇怪的故障。在下面的輸入文件中,我應該把名字和數字放在6個不同的變量中。將名稱轉換爲字符串,將數字轉換爲數組,將最後兩個數字轉換爲int。從txt文件輸入數字。奇怪的故障C++

當我運行我的程序,並想抓住任何字符串的第十個數字時,它會向我呈現下一個字符串,例如。希望在Alice的成績中得到15分。

這裏的文件,這裏的代碼請幫助。

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

using namespace std; 

//all of a students info is stored here 
struct Student { 
    string name; 
    int asgn[9]; 
    int quiz[9]; 
    int lab[9]; 
    int midterm; 
    int final; 

}; 
Student s[22]; 







int main(){ 

    string str; 
    ifstream in; 


    in.open("C:/CS161Grades.txt"); 

    for (int i = 0; i < 22; i++){ 
     getline(in, str); 
     stringstream ss(str); 
     ss >> s[i].name >> s[i].asgn[0] >> s[i].asgn[1] >> s[i].asgn[2] >> s[i].asgn[3] >> s[i].asgn[4] >> s[i].asgn[5] >> s[i].asgn[6] >> s[i].asgn[7] >> s[i].asgn[8] >> s[i].asgn[9] 
      >> s[i].quiz[0] >> s[i].quiz[1] >> s[i].quiz[2] >> s[i].quiz[3] >> s[i].quiz[4] >> s[i].quiz[5] >> s[i].quiz[6] >> s[i].quiz[7] >> s[i].quiz[8] >> s[i].quiz[9] 
      >> s[i].lab[0] >> s[i].lab[1] >> s[i].lab[2] >> s[i].lab[3] >> s[i].lab[4] >> s[i].lab[5] >> s[i].lab[6] >> s[i].lab[7] >> s[i].lab[8] >> s[i].lab[9] 
      >> s[i].midterm 
      >> s[i].final; 

     cout << s[2].name << s[2].lab[9] << endl; 
    } 







//pause and stop 
    getchar(); 
    getchar(); 
    return 0; 
} 

文件被格式化爲例如具有二十學生

Name  Assignments      Quizzes       Labs        MidT Final 

    Alice 71 97 64 30 99 54 8 88 92 94 15 55 91 37 71 1 5 52 37 46  6 19 17 68 7 97 36 31 33 10  72 46 
+1

輸入行太長了,太糟糕了。你爲什麼不循環? – Maresh

回答

0

1 - 不僅int asgn[9];陣列也int quiz[9];int lab[9];陣列可以僅包含9族元素。但是您正在嘗試爲每個數組讀取10。試着用替換你的結構:

struct Student { 
string name; 
int asgn[10]; 
int quiz[10]; 
int lab[10]; 
int midterm; 
int final; 

}; 

或者您可以使用std ::載體,如果你希望你的列表大小是靈活的。

2 - 您發佈的文本文件片段似乎在第一行有標題。因此,您可能需要先閱讀它們,然後從第二行開始以while循環開始讀取數據。這比for循環更靈活,因爲稍後您可能需要閱讀更多學生數據。隨着for循環,你將不得不修改循環界限而用while循環,那倒是必要的:

getline(in, str); // str has the titles if you need them 
... 
while (getline(in, str)) // Now you are reading the data line by line 
{ 
    // Your code to process str goes here 
} 
+0

謝謝大家,這非常有幫助,我認爲它就像0 - 9,意味着十個變量非常感謝你的幫助。 – Galindan

0

這裏:

int asgn[9]; 

這是通過asgn[8]空間足夠用於號(asgn[0] ),但您正試圖在其中存儲十個。您的任務編號爲asgn[9]會寫入數組末尾,這是未定義的行爲。

0

好的,所以我修復了你的代碼,基本上問題是你對數組的大小以及它被索引爲0的事實感到困惑。每個數組有10個元素,所以你需要聲明你的表爲int arr[10]而不是9.但是當你引用它時,arr [9]是第10個元素。得到它了? :)

我爲這個可怕的行實現了一個快捷方式,它可能會更乾淨,但我不想太多屠殺你的代碼,讓你自己想一想。

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

using namespace std; 

#define AR_SIZE 10 

//all of a students info is stored here 
struct Student { 
    string name; 
    int asgn[AR_SIZE]; 
    int quiz[AR_SIZE]; 
    int lab[AR_SIZE]; 
    int midterm; 
    int final; 

}; 
Student s[22]; 


void fill_array(int *arr, stringstream &ss) { 
    for (int idx = 0; idx < AR_SIZE; idx++) { 
      ss >> arr[idx]; 
      cout << arr[idx] << " "; 
    } 
    cout << "\n"; 
} 

int main(){ 

    string str; 
    ifstream in; 


    in.open("test.txt"); 

    for (int i = 0; getline(in, str); i++) { 

     stringstream ss(str); 
     ss >> s[i].name; 

     fill_array(s[i].asgn, ss); 
     fill_array(s[i].quiz, ss); 
     fill_array(s[i].lab, ss); 

     ss >> s[i].midterm >> s[i].final; 

     cout << s[2].name << s[2].lab[9] << endl; 
    } 


//pause and stop 
    getchar(); 
    getchar(); 
    return 0; 
}