2013-05-06 4 views
0

я пытаюсь прочитать в следующем текстовом файле в различные переменные:чтение текста с пробелами в C++

title 
subject name 
123 
subject2 name 
124 
subject3 name 
125 

до сих пор Я использую следующий код

ifstream myfile; 
myfile.open("filename.txt"); 
......etc 

myfile >> string1 
while(myfile >> string2 && myfile >> int1){ 
    cout << "read string " << string2 << "and int " << int1 << endl; 
} 

Этот метод кажется, не нравится пространство между «именем субъекта», и оно не подбирается, поэтому он не запускает цикл while. Есть ли простой способ, я могу это исправить?

+0

Итак ... вы хотите получить значение из каждой строки в переменной? – aldo

+0

yeh каждая строка - это переменная, некоторые из которых являются int, некоторые являются строками – Edd

ответ

1

Первая проблема, которую я заметил, когда я посмотрел на свой коде была недостающая точкой с запятой ; после

myfile >> string1, но это просто ошибка синтаксиса.

Цикл while, который вы пытаетесь использовать, будет оценивать только в том случае, если оба условия истинны, потому что вы используете оператор &&.

Как @sftrabbit сказал оператор извлечения >> в C++ оставляет символ новой строки \n во входном буфере, а затем, когда вы пытаетесь ввести

std::getline(myfile, string2) && myfile >> int1 

Первое условие std::getline(myfile, string2) не имеет проблем с получением новый символ линии и будет оценивать значение true, но тогда второе условие myfile >> int1 будет оцениваться как false, потому что оно получит символ (ы), когда ожидает целое число. Вот почему цикл while не хочет выполнять.

Вы можете легко исправить эту проблему при изменении оператора извлечения в myfile >> string1 с getline(myfile, string1);, потому что getline оставит пустой буфер ввода.

Но тогда у вас будет другая проблема. Цикл while будет выполняться только один раз, потому что во входном буфере остается \ n, поэтому вам понадобится myfile.ignore(numeric_limits<streamsize>::max(), '\n');.

Ваш окончательный код должен выглядеть следующим образом:

int main() 
{ 
    ifstream myfile; 
    string string1; 
    string string2; 
    int int1; 

    myfile.open("filename.txt"); 

    getline(myfile, string1); 

    while(getline(myfile, string2) && myfile >> int1) 
    { 
     myfile.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "read string " << string2 << " and int " << int1 << endl; 
    } 

    return 0; 
} 

Я надеюсь, что это поможет.

+0

, это был первый getline, который я отсутствовал, это отличное спасибо много! – Edd

0

Добыча с >> в std::string будет считываться до следующего пробела. Так что да, он будет извлекать только одно слово из строки. Если вы хотите извлечь всю строку, используйте std::getline. Вы можете включить его следующим образом:

while(std::getline(myfile, string2) && 
     myfile >> int1) { 
    myfile.ignore(); 
    cout << "read string " << string2 << "and int " << int1 << endl; 
} 

ignore требуется, потому что добыча в int оставит следующий \n символ в потоке. Это необходимо удалить для следующего std::getline на следующей итерации, чтобы преуспеть.

+0

Я пробовал это, и он все еще не запускает цикл while – Edd

+0

@clairharrison Сколько вы получаете? –

+0

Я получаю совершенно пустой вывод – Edd

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