2015-02-24 1 views
0

Я понял, как искать и читать слова из текстового файла. Я также понимаю, как вы можете использовать getline(), чтобы пройти через текст и прочитать определенную строку.C++ Чтение слов и строк в одном цикле чтения

Но теперь я пытаюсь выяснить, как использовать оба в том же «цикле чтения».

Было бы что-то вроде этого:

string S1="mysearchword01",S2="mysearchword02"; 
    char word[50]; 

    while(myfile.good()){ //while didn't reach the end line 

     file>>word; //go to next word 
     if (word==S1){ //if i find S1 I cout the two next words 
      file>>a>>b; 
      cout<<a<<" "<<b<<endl;} 
      } 
     else if (word==S2) { 
      //****here I want to cout or save the full line*****  
      } 
    } 

Так я могу использовать GetLine там каким-то образом?

Заранее спасибо.

+1

'while (myfile.good())' Это неправильно. Он вернет true в пустой файл. Чтобы прочитать строку, используйте 'string line; while (getline (myfile, line)) {..} ' –

+0

while (myfile.good()) работает для меня. Если я использую этот код без «else if», он просматривает мой текстовый файл слово за словом для S1. Если он найдет, что он вызывает два следующих слова. Затем цикл while останавливается, когда он попадает в конец файла. – remi000

+0

Слово должно быть символом, а не строкой, будет редактировать. – remi000

ответ

0

std::fstream::good() проверяет, прошла ли последняя операция ввода-вывода, и, хотя она работает так, как вы ее реализуете, на самом деле вы этого не хотите.

Вместо вызова good() в цикле while он также возвращает false, когда конец файла достигнут.

EDIT: Для того, чтобы извлекать отдельные пробелы разделителями элементы (слова) от линии, которую вы получаете от std::getline(), вы можете использовать std::stringstream, инициализировать его строки строки, а затем извлекать отдельные слова из этого stringstream в другое «слово ", используя оператор >>.

Так что для вашего случая, что-то, как это будет делать:

#include <sstream> 

std::string line, word; 

while (getline(file, line)) 
{ 
    std::stringstream ss(line); 

    ss >> word; 

    if (word == S1) 
    { 
     // You can extract more from the same stringstream 
     ss >> a >> b; 
    } 

    else if (word == S2) 
    { 
     /* ... */ 
    } 
} 

В качестве альтернативы вы можете создать экземпляр объекта stringstream один раз и называете его str() метода, одна перегрузки которого сбрасывает поток, а другая перегрузка заменяет его содержание.

#include <sstream> 

std::stringstream ss; 

std::string line, word; 

while (getline(file, line)) 
{ 
    ss.str(line); // insert/replace contents of stream 

    ss >> word; 

    if (word == S1) 
    { 
     // You can extract more from the same stringstream 
     ss >> a >> b; 
    } 

    else if (word == S2) 
    { 
     /* ... */ 
    } 
} 

Вы можете использовать stringstream извлечь несколько слов, а не только первая, просто продолжать называть operator>>, как вы делали раньше.

+0

Хорошо, спасибо. Но в этом случае слово будет всей линией? Не первое слово в строке? – remi000

+0

@ remi000 слово будет целая линия здесь. Если вы поместите его в строковый поток, вы можете извлечь фактические слова. –

+0

Да, это цель getline. Если вы хотите, чтобы элементы, разделенные пробелами, были доступны из этой строки, вы можете либо следовать совету Нила, либо написать некоторую функцию расщепления, такую ​​как метод split() 'Python для встроенных строк. –