2010-11-14 48 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()这个大文件,并且像在内存中一样使用数据。