C ++ Почему это происходит при попытке прочитать файл формы и разделить на разные переменные? - PullRequest
0 голосов
/ 13 марта 2020

Итак, файл inputs.txt выглядит следующим образом

john connor
neil young
cat stevens

и, увидев этот вопрос, я пытаюсь прочитать его вот так

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

int main() {

        ifstream inputFile("inputs.txt");

        string s1, s2;
        string line;
        stringstream sline;

        while ( getline(inputFile, line) ) {

                sline.str(line);

                sline >> s1 >> s2;

                cout << "Just read: " << s1 << " " << s2 << endl;
        }

        inputFile.close();
        return 0;
}

но вывод я получаю

Just read: john connor
Just read: john connor
Just read: john connor

Почему это происходит? Что я делаю не так? Буду признателен за любую помощь!

Редактировать: После исправления моей проблемы, используя комментарий rafix07 , я заметил, что если я добавлю несколько пустых строк в inputs.txt подать вывод, который я получаю

john connor
neil young

cat stevens


результат, который я получаю

Just read: john connor
Just read: neil young
Just read: neil young
Just read: cat stevens
Just read: cat stevens
Just read: cat stevens

(что нежелательное поведение)

1 Ответ

0 голосов
/ 13 марта 2020

Как упомянуто в комментарии, введите

    sline.clear();  

в то время как l oop, это сбрасывает I / O Status.Because после этого sline >> s1 >> s2; бит eof установлен в true.

см. это:

    while ( getline(inputFile, line) )
    {
            sline.clear();

            sline.str(line);

            sline >> s1 >> s2;

            cout << "Just read: " << s1 << " " << s2 << endl;
    }

Вы также можете просто ввести следующий код:

 #include <iostream>
 #include <fstream>
 #include <string>
 #include <stdlib.h>

 int main() 
 {

         std::ifstream inputFile("inputs.txt");

         if(inputFile.is_open()==0)
         {
             std::cout<<"File Error";
             exit(1);
         }

         std::string line;

         while ( getline(inputFile, line) )
                    std::cout << "Just read: " <<line << std::endl;

         inputFile.close();
         return 0;
 }

РЕДАКТИРОВАТЬ:

, если вы хотите разделить две строки, попробуйте это

    std::string s1,s2;

    while ( inputFile>>s1>>s2 )
               std::cout << "Just read: " <<s1<<" "<<s2 << std::endl; 
...