2016-12-16 55 views
-1

我的矢量不是從我有它檢索文件中獲取數據。我創建了一個名爲Student的類,並且需要爲它創建一個向量來存儲學生的多個值。代碼在我的原始測試文件上工作,但是當我更換學生時,它出錯了。將數據讀入一個矢量對象

下面是在主要的部分:

vector<Student> studentVector; //creating a vector using the defined class Student 

string userFile = ""; 
string filename = ""; 

int numStudents = 0; //total number of students 
int numQuestions = 0; //total number of questions 
string key = ""; //answer key 


cout << "Enter the name of the file: "; 
cin >> userFile; //get name of file from user 

filename = checkFile(userFile, numQuestions, key); //gets info from file and returns the new file name to get student answers 
fillVector(studentVector, filename, numStudents); //fills vector with values from file 

下面是讀取數據的功能:

void fillVector(vector<Student>& newStudentVector, string filename, int& numStudents) { 

ifstream studentAnswers; //read mode file 
string line = ""; //used to read lines 

int id = 0; 
string fName = ""; //first name 
string lName = ""; //last name 
string answers = ""; 

studentAnswers.open(filename); //opens file using filename passed into function 

while (getline(studentAnswers,line)) { 
    ++numStudents; //reads the number of lines in file 
} 

studentAnswers.close(); //closed file because it reached end of file 

studentAnswers.open(filename); //reopens file 

for (int i = 0; i < numStudents; i++) { 

    //reads file data 
    studentAnswers >> id; 
    studentAnswers >> fName; 
    studentAnswers >> lName; 
    studentAnswers >> answers; 

    Student newStudent(id, (fName + " " + lName), answers, 100.00, "A"); //creates a new object 
    newStudentVector.push_back(newStudent); //adds new vector with newStudent data 

} 
studentAnswers.close(); //close file 
} 
+1

爲什麼需要打開文件兩次?爲什麼不打開一次,第一次閱讀學生?你會通過'newStudentVector.size()'知道有多少學生。 – PaulMcKenzie

+0

你說得對,我甚至都沒有想過! –

+0

在網上搜索「計算器C++讀取文件載體」。總是先研究。 –

回答

0

你要打開你的字符串名的文件是這樣的:

studentAnswers.open(filename.c_str()); 

嘗試遍歷你的載體是這樣的:

getline(studentAnswers,line) 
while (!studentAnswers.eof()) { 
    getline(studentAnswers,line) 
    ++numStudents; 
} 
+0

自C++ 11以來,可以使用const std :: string&filename打開std :: ifstream) –

+1

請不要使用'.eof()'作爲while循環條件。它幾乎總是產生錯誤的代碼,就像它在這種情況下那樣。見http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line –

0

假設你已經實現了operator>>(std::istream&, Student&),那麼實現fillVector()的一個相當簡單的方法就是使用流迭代器。

void fillVector(std::vector<Student>& newStudentVector, 
       std::string filename, int& numStudents) { 
    std::ifstream studentAnswers(filename); 
    if (!studentAnswers) { 
     std::cout << "WARNING! studentAnswers file not found\n"; 
    } 
    newStudentVector.assign(
     std::istream_iterator<Student>(studentAnswers), 
     std::istream_iterator<Student>()); 
    numStudents = newStudentVector.size(); 
}