2011-10-31 164 views
0

對於文本的每一行:(會有線的未知量,每個尋找相同的格式)矢量,我不知道該怎麼辦

-Get first name 
-Get last name 
-Get Student Number 


格式:

First Last 111111111 
First Last 111111112 
... 

我想把每個學生放到自己的結構中。我已經設置了結構如下:

struct Student{ 
    string lastName; 
    string firstName; 
    string stdNumber; 
    double assgn1;//doubles will be used later in prog. 
    double assign2; 
    double assign3; 
    double assign4; 
    double midTerm; 
    double finalGrade; 
}; 

我的文件輸入功能如下:

int getFileInfo() 
{  
    int failed=0; 
    ifstream fin; 
    string fileName;  
    vector<Student> students; 

    Student s;     // A place to store data of one student 
    cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl; 
    do{         
     if(failed>=1)       
      cout<<"Please enter a correct filename."<<endl; 
     cin>>fileName;        
     fin.open(fileName.c_str());// Open the file  
     failed++;           
    }while(!fin.good());           
    while (fin >> s.firstName >> s.lastName >> s.stdNumber) 
     students.push_back(s);      
    fin.close();        
    return 0;         
} 

在文件輸入,我做一個載體,但我不確定如何訪問它的每個單獨部分或學生s,因爲它似乎只能讓一個學生。我被告知,文件的每一行都被分割並輸入到students向量中,但我不知道如何提取該信息。我如何讓每個學生脫離students向量並進入它自己的結構,這樣我就可以將每個學生用作它自己的結構? 所以,最後,我想成爲能夠輸出:

Student1: First Last 111111111 
Student2: First Last 111111112 
However More students are in the file 

在此先感謝您的幫助!

@Loki 我改變了循環,所以loop != end,我仍然得到同樣的問題。這裏是我的代碼:

int getFileInfo() 
{ 
int failed=0; 
ifstream fin; 
string fileName; 
vector<Student> students;// A place to store the list of students 
vector<Student>::iterator loop = students.begin(); 
    vector<Student>::iterator end = students.end(); 

Student s;     // A place to store data of one student 
cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl; 
do{ 
if(failed>=1) 
    cout<<"Please enter a correct filename."<<endl; 
    cin>>fileName; 
    fin.open(fileName.c_str());// Open the file 
    failed++; 
}while(!fin.good()); 

while (fin >> s.firstName >> s.lastName >> s.stdNumber){ 
    cout<<"Reading "<<s.firstName<<" "<<s.lastName<<" "<<s.stdNumber<<endl; 
    students.push_back(s); 
} 
fin.close(); 

    for(loop;loop!=end;++loop) 
    cout<<loop->firstName<<" "<<loop->lastName<<" "<<loop->stdNumber<<endl; 

return 0; 
} 

此外,Visual Studio是說vector iterators incompatible
指着 「C:\ Program Files文件(x86)的\微軟的Visual Studio 10.0 \ VC \包括\載體」

+0

Nothing fancy.Just read [ifstream :: read()](http://www.cplusplus.com/reference/iostream/) istream/read /)來自該文件的每個結構,並使用[vector :: push_back](http://www.cplusplus.com/reference/stl/vector/push_back/)將其保存在向量中。 –

+0

我已經將數據從文本文件中刪除並放入向量中。它從我遇到的結構向量中獲取保存的數據。 – b3orion

+0

我加了一個答案,希望對你有所幫助。 –

回答

1

在文件輸入,我做一個載體,但我不確定如何訪問它的每個部件。

可以通過操作員訪問各個元素[]

students[0].firstName; // get the first name. 

std::cout << students[1].firstName; // prints out the first name. 

可以使用的索引從0 - >尺寸()。

size_t size = students.size(); // number of students in the vector. 

students[size].firstName; // This is wrong. You expression in 
          // [] must be less than size as the elements are 
          // numbered from 0 to size() -1. 

,因爲它似乎只讓一個學生。

您只創建一個學生的'(作爲一個方面沒有選擇一個更好的名字)。但是當你調用push_back()時,你正在將這個學生對象複製到vector中。所以矢量得到它存儲的's'的副本。然後每次通過循環時,用從文件中檢索的新值覆蓋's'中的舊值。

有人告訴我,文件的每一行都被拆分並輸入到學生向量中,但我不知道如何提取該信息。

由於每個元件如上所述可以單獨使用操作[]

或者,也可以使用迭代得到一個範圍達到。學生的。

std::vector<Student>::iterator loop = students.begin(); 
std::vector<Student>::iterator end = students.end(); 

您可以通過取消參考循環訪問元素並通過遞增循環移動到下一個學生。

std::cout << loop->firstName; // prints out student[0] 
++loop;       // Increment loop now it points at student 1 
std::cout << loop->firstName; // prints out student[1] 
++loop;       // Increment loop now it points at student 2 
// etc 

如果循環==結束,那麼你已經移過所有的學生。

如何讓每個學生離開學生向量並進入自己的結構,這樣我就可以將每個學生用作自己的結構?

學生們已經在結構中了。你可以像使用外部結構一樣直接使用它們。但是,如果你想將它們複製出來,你可以這樣做:

Student tmp = students[0]; // copies student 0 into tmp. 

我想成爲能夠輸出:

使用std ::法院輸出的東西到標準輸出。或創建std :: ofstream類型的對象以輸出到文件:

std::cout << tmp.lastName << " " 
      << tmp.firstName << " " 
      << tmp.stdNumber << "\n"; 

std::ofstream file("plop1.txt"); 
file  << tmp.lastName << " " 
      << tmp.firstName << " " 
      << tmp.stdNumber << "\n"; 
+0

當我嘗試輸出使用'std :: cout',它給了我一個彈出窗口,它顯示''Debug Assertion Failed!「'表達式:向量迭代器不可忽略。」任何想法是什麼意思?我可以看到一個問題出現在一個不可取消的引用循環中... – b3orion

+0

您是否嘗試去引用傳入結尾的迭代器(如end()所返回的迭代器所指示的那樣)。 –

+0

我做了for循環:'for(loop; loop == end; ++ loop)'現在它說'vector iterators incompatible'。你可以解釋嗎? – b3orion

2

Online Demo Sample:

#include<iostream>  
#include<string> 
#include<vector> 

using namespace std; 

struct Student 
{ 
    string lastName; 
    string firstName; 
    string stdNumber; 
    double assgn1;//doubles will be used later in prog. 
    double assign2; 
    double assign3; 
    double assign4; 
    double midTerm; 
    double finalGrade; 
}; 

int main() 
{ 
    Student obj; 
    obj.firstName = "ABC"; 
    obj.lastName = "XYZ"; 

    vector<Student> students; 
    students.push_back(obj); 
    vector<Student>::iterator it; 

    cout << "students contains:"; 
    for (it=students.begin() ; it != students.end(); ++it) 
    { 
     cout << " " << (*it).firstName; 
     cout << " " << (*it).lastName; 
     //And so on... 
    } 

     return 0; 
} 
+1

'it Nawaz

+0

@Nawaz:看上去很好。我在編輯時很感謝你指出。 –

+0

+1現在.......... – Nawaz

相關問題