cout не печатает константные строки, а печатает переменные - PullRequest
0 голосов
/ 09 мая 2020

Я написал следующий фрагмент кода, и после долгого изучения его и опробования набора различных вещей я ничего не добился. Проблема в том, что текст, который печатается на экране, хотя и «правильный», не включает постоянные строки, которые я печатаю каждый раз, например "date: " или "task: ".

Вот код:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main() {

    ifstream myFile("calend.txt");

    vector<string> info;
    string str;

    while (getline(myFile, str, '-')) {

        info.push_back(str);

        if (info.size() > 1) {

            cout << "date: " << info.at(0) << endl;
            cout << "task: " << info.at(1) << endl;

            info.clear();
        }
    }

    myFile.close();
    system("pause");
    return 0;
}

Вот текстовый файл (calend.txt):

15/05-checkpoint IART
18/05-checkpoint COMP
22/05-SDIS
25/05-apresentacao PPIN
27/05-IART
28/05-apresentacao LPOO
28/05-teste PPIN
01/06-LBAW
05/06-COMP
08*14/06-PPIN

И, наконец, вот результат:

date: 15/05
task: checkpoint IART
18/05
date: checkpoint COMP
22/05
task: SDIS
25/05
date: apresentacao PPIN
27/05
task: IART
28/05
date: apresentacao LPOO
28/05
task: teste PPIN
01/06
date: LBAW
05/06
task: COMP
08*14/06

Как видите, первые две строки печатаются правильно, но затем строки const пропускаются. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Первая строка l oop говорит: дайте мне все до '-', поэтому вы в основном делаете getline (), чтобы пропустить разделители строк и искать только символ '-'.

Вот почему он правильно разделяется на первой итерации и печатает

date: 15/05

Но затем вторая итерация захватывает все до следующей '-' и дает вам

task: checkpoint IART
18/05

И с этого момента все как бы сдвинуто .

Чтобы исправить это, попробуйте вызвать getline () без '-', чтобы прочитать файл построчно в str, затем разделите str на два токена.

1 голос
/ 09 мая 2020

Вы используете разделитель '-' в std::getline().

Итак, из строки # 1:

15/05-checkpoint IART
^^^^^

Только 15/05 читается и сохраняется в str .

И затем он продолжает читать до другого разделителя, то есть строки №1 и 2:

15/05-checkpoint IART
      ^^^^^^^^^^^^^^^

18/05-checkpoint COMP
^^^^^

И так продолжается.

Вот почему вы видите вывод:

date: 15/05
task: checkpoint IART
18/05

Это ваш единственный вывод на консоли.

Решение:

Прочтите до -, а затем до новой строки следующим образом:

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

int main()
{
    std::ifstream myFile { "calend.txt" };
    if ( !myFile.is_open() )
    {
        std::cerr << "Could not open file!\n";
        return -1;
    }

    std::vector<std::string> info;
    std::string date;
    std::string task;

    while ( getline(myFile, date, '-') && getline(myFile, task) )
    {
        info.push_back( date );
        info.push_back( task );

        if ( info.size() > 1 )
        {
            std::cout << "date: " << info.at(0) << '\n';
            std::cout << "task: " << info.at(1) << '\n';
            info.clear();
        }
    }

    myFile.close();
    return 0;
}

Вывод:

date: 15/05
task: checkpoint IART
date: 18/05
task: checkpoint COMP
date: 22/05
task: SDIS
date: 25/05
task: apresentacao PPIN
date: 27/05
task: IART
date: 28/05
task: apresentacao LPOO
date: 28/05
task: teste PPIN
date: 01/06
task: LBAW
date: 05/06
task: COMP
date: 08*14/06
task: PPIN

Соответствующие чтения:

...