2010-11-14 47 views
0

我想知道,如果有另一種方式來讀出一個大文件讀出一個大txt文件

Hans //name 

Bachelor // study_path 

WS10_11 //semester 

22 // age 

,而不是像這樣:

fout >> name; //string 

fout >> study_path; //string 

fout >> Semester ; //string 

fout >> age; //int 

,當我的文件變成超過20線我應該做20 + fouts?

還有別的辦法嗎?

+0

您可能想了解循環。 – pmr 2010-11-14 13:33:32

+0

另一個提示(SCNR):使用國際標識符和評論。 Hierkönnennur wenige deutsch。 – sbi 2010-11-14 14:09:33

回答

10

你可以定義一個類來保存每個人的數據:

class Person { 
public: 
    std::string name; 
    std::string study_path; 
    std::string semester; 
    unsigned int age; 
}; 

然後,你可以定義一個流提取運算該類:

std::istream & operator>>(std::istream & stream, Person & person) { 
    stream >> person.name >> person.study_path >> person.semester >> person.age; 
    return stream; 
} 

然後你可以閱讀整個文件是這樣的:

std::ifstream file("datafile.txt"); 
std::vector<Person> data; 
std::copy(std::istream_iterator<Person>(file), std::istream_iterator<Person>(), 
      std::back_inserter(data)); 

這將讀取整個文件並存儲所有的extrac特德在vector記錄。如果您知道您將提前閱讀的記錄數,則可以在閱讀文件之前致電data.reserve(number_of_records)。因此,該矢量將具有足夠的內存來存儲所有記錄而無需重新分配,如果文件很大,這可能會加速加載。

+0

thx很多很好的答案:D – demonking 2010-11-14 13:45:23

+4

除非你需要處理未出生的學生,否則我會讓年齡爲'unsigned'。 – 2010-11-14 13:48:47

+0

@demonking:如果答案解決了您的問題,您可以使用答案左側的勾號接受該答案。這樣可以更容易地爲其他人找到同樣的問題,並獎勵花費時間來回答的問題(也可以考慮另外兩個問題)。 – 2010-11-14 13:53:46

1

如果你在linux上,你可以用mmap()這個大文件,並且像在內存中一樣使用數據。