Смешивание cin и getline под Linux и Windows

Я осознаю общую проблему смешивания cin и getline. Я считаю, что это другое.

Это программа:

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main() {
int a;
string line;
cin >> a;
printf("A is '%d'\n", a);
getline(cin, line);
printf("Line is '%s'\n", line.c_str());
cout << cin.fail() << cin.eof() << cin.bad() << endl;
}

У меня также есть версия, написанная с использованием istream :: getline. Я считаю, что результаты одинаковы во всех случаях ввода, приведенных здесь.

a.out < test1
A is '1'
'ine is ' abc 2
000

a.out < test2
A is '1'
Line is ' abc 2'
000

где test1 есть $'1 abc 2\r\n' (9 байт) и test2 — это $'1 abc 2\n' (8 байт).

Я явно не проводил эти тесты под Windows, но у меня есть догадка, что выходные данные «как предполагалось», то есть такие же, как выходные данные теста 2.

Мой вопрос: объясните результаты теста 1.
Например: почему вывод printf поврежден; существует ли проблема переносимости, связанная с интерпретацией окончаний строк; как можно исправить код с минимальным изменением логики.

2

Решение

Под Linux getline удаляет \n из входного потока. Тем не менее, он не удаляет \r,

возврат каретки (\r) вернутьнавести курсор на начало текущей строки. Так что в printf вызов, курсор STDOUT возвращается в начало строки, когда он видит \r, Следующий символ, который он печатает, ', который перезаписывает первый символ в строке ( L).

Вы не видите такого поведения, когда нет \r в файле.

Простое решение, чтобы решить эту проблему: вручную проверить \r при работе под Linux и Unix.

2

Другие решения

Других решений пока нет …