2016-07-17 2 views
-3

Моя проблема заключается в:
Ifstream дает мне только 16 элементовifstream дает мне только 16 элементов

Привет, В моей C++ код у меня есть несколько классов. К ним относятся:
-Data (Включите некоторые номера)
-Towns (Включить по крайней мере 2 данных -Объектов (в векторе), и название штата)
-County (Управление Тауна -Объектов)

Программа должна заполнить Город объект с данными данного файла. код выглядит следующим образом:

COUNTRY.CPP:

Country::Country(string file) { 
    ifstream x(file); 

    Town t; 
    while (x.good()) { 
    x >> t; 
    this->towns.push_back(t); 
    } 
} 

Чтобы получить более глубокое положение -> «>> т» выглядит следующим образом:

TOWN.CPP :

istream& operator>>(std::istream& is, Town& d) { 
    is >> d.state>> d.town; 
    Data a, b; 
    a.SetYear(2011); 
    is >> a >> b; 

    // Some other code was here - but i think it's not relevant 

return is; 
} 

Для того, чтобы получить более глубокое положение -> «>> A» выглядит следующим образом:

DATA.CPP:

istream& operator>>(std::istream& is, Data& d) { 
    return is >> d.total >> d.male >> d.female; 
} 

Как вы видели - городов в данном файле. Структура в файле повторяться снова и снова (в общей сложности: 11292) и выглядит следующим образом:

SOURCE (пример)

Baden-Württemberg 
Kirchheim am Neckar 
5225 
2588 
2637 
5205 
2608 
2597 
Baden-Württemberg 
Kornwestheim 
31053 
15167 
15886 
31539 
15502 
16037 

первая линия: Государственный
второй линии: Город
третий-пятый и шестой-восьмой линии: Данные
REPEAT

Су ... И по какой-то причине ifstream только дает мне 16 элементов (16 Tow нс). Hmmm ....

+1

'Kirchheim am Neckar' -' 'std :: string :: operator >>' только читается до первого символа пробела.Возможно, именно поэтому вы не получаете все свои данные, или, по крайней мере, это, по-видимому, является недостатком в вашем чтении ввода. Все, что вы получите, это «Кирхгайм», а не «Кирххайм-ам-Неккар». – PaulMcKenzie

ответ

2

Чтение a std::string с использованием оператора сдвига, всего лишь одно слово. По умолчанию слова разделяются пробелами. В результате строка Kirchheim am Neckar не будет считана полностью, но будет прочитано только Kirchheim. При попытке чтения am в качестве целого потока поток переходит в режим отказа и отказывается читать что-либо, пока его флаги не будут clear() ред.

Возможно, вы захотите прочитать город и, возможно, состояние, прочитав всю линию. Для этого используйте std::getline(stream, str). Кроме того, всегда успешный тест вашей операции чтения после попытка чтения. Идиоматический способ использования потока:

while (x >> t) { 
    ... 
} 
Смежные вопросы