2010-11-14 4 views
0

я хочу знать, если есть другой способ считывания большого файласчитывания большой текстовый файл

Hans //name 

Bachelor // study_path 

WS10_11 //semester 

22 // age 

и не нравится:

fout >> name; //string 

fout >> study_path; //string 

fout >> Semester ; //string 

fout >> age; //int 

когда мой файл превращается в более чем 20 line я должен сделать 20+ fouts?

Есть ли другой способ?

+0

Возможно, вам захочется узнать о циклах. – pmr

+0

И еще один намек (SCNR): используйте международные идентификаторы и комментарии. Хери Кённн ню вениге деутч. – sbi

ответ

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 ted записей в vector. Если вы знаете количество записей, которые будете читать заранее, вы можете позвонить data.reserve(number_of_records) перед чтением файла. Таким образом, у вектора будет достаточно памяти для хранения всех записей без перераспределения, что может потенциально ускорить загрузку, если файл большой.

+0

thx много для отличного ответа: D – demonking

+4

Я бы поставил возраст 'unsigned', если вам не нужно обрабатывать неродившихся студентов. –

+0

@demonking: Если ответ решает вашу проблему, вы можете принять его как правильно, используя галочку слева от ответа. Это облегчает поиск для других с той же проблемой, и это вознаграждает то, на что уходит время, чтобы ответить (подумайте об этом и для двух других вопросов). –

1

Если вы работаете в Linux, вы можете mmap() большой файл и использовать данные так, как есть в памяти.

Смежные вопросы