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');
}