C ++ - Cin.ignore и получить данные из другого файла - PullRequest
0 голосов
/ 24 октября 2018

У меня есть входной файл, и я пытаюсь получить некоторые данные из моего файла и показать в выходных данных.

Данные в файле:

SS
0
NN
1

XX
10
YY
20

и мой код:

ifstream inFile;
inFile.open("input.txt");

string s1, s3;
int n2, n4;

while ( inFile ) {

    getline(inFile, s1);
    cout << "1: " << s1 << endl;

    inFile >> n2;
    cout << "2: " << n2 << endl;
    inFile.ignore(1000, '\n');

    getline(inFile, s3);
    cout << "3: " << s3 << endl;

    inFile >> n4;
    cout << "4: " << n4 << endl;
    inFile.ignore(1000,'\n');

    cout << endl;
}

при проверке выхода!вывод:

1: SS
2: 0
3: NN
4: 1

1:
2: 0
3: NN
4: 1

Я думаю, что моя проблема должна быть из-за inFile.ignore().Не могли бы вы объяснить мне, что происходит?

1 Ответ

0 голосов
/ 24 октября 2018
while ( inFile ) {

  getline(inFile, s1);
  cout << "1: " << s1 << endl;

  inFile >> n2;
  cout << "2: " << n2 << endl;

Вы обрабатываете мусор, когда извлечение не удается.

#include <cstdlib>
#include <string>
#include <fstream>
#include <iostream>

int main()
{
    std::ifstream inFile{ "input.txt" };
    if (!inFile.is_open())
        return EXIT_FAILURE;

    std::string s1, s3;
    int n2, n4;

    while (inFile >> s1 >> n2 >> s3 >> n4)
        std::cout << "1: " << s1 << "\n2: " << n2 << "\n3: " << s3 << "\n4: " << n4 << "\n\n";
}

Вывод:

1: SS
2: 0
3: NN
4: 1

1: XX
2: 10
3: YY
4: 20

Если строки действительно могут содержать пробелыи два набора данных разделены пустой строкой:

#include <limits>

// ...

while (std::getline(inFile, s1) && (inFile >> n2) &&
       inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n') &&
       std::getline(inFile, s3) && (inFile >> n4))
{
    std::cout << "1: " << s1 << "\n2: " << n2 << "\n3: " << s3 << "\n4: " << n4 << "\n\n";
    inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
...