Отсутствие буферизации ввода и очистка stdin иногда очищает один входной символ (c ++, windows)

Проблема связана только с Windows. Я использую компилятор Visual Studio 2012 (vc11).

Я хотел бы прочитать несколько строк (символ за символом) из входного файла (который перенаправляется как стандартный ввод). Но после прочтения каждой строки, я хотел бы fflush stdin.

Позвольте мне объяснить подробнее:
Я отключаю буферизацию stdin с помощью функции setvbuf (без этого stdin буферизуется, и первый сброс очищает весь ввод).
Затем программа читает несколько строк из входного файла. Символы читаются один за другим (функция fgetc). После каждой строки я очищаю стандартный ввод с помощью fflush. В Windows fflush на входном потоке определяется. Согласно MSDN: «Если поток открыт для ввода, fflush очищает содержимое буфера». https://msdn.microsoft.com/en-us/library/aa272686(v=vs.60).aspx

Но я не понимаю, как это работает. Вы можете видеть, что иногда первый символ (строки) не читается из ввода. Возможно, из-за fflush (может быть, fflush очищает этот первый символ из буфера stdin?). Но это происходит только для нескольких строк (некоторые строки читаются с первым символом).

Почему этот первый персонаж исчезает (иногда)?

Как я могу это исправить? (при условии, что я хотел бы вызвать fflush (stdin) после прочтения каждой строки).

Программа:

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

int main()
{
setvbuf(stdin, 0, _IONBF, 0);
std::string text[6];
for(int i = 0; i < 6; i++)
{
int input;
char cc;
do
{
input = fgetc(stdin);
cc = (char)input;
if (cc != '\n' && input != EOF)
{
text[i] += cc;
}
}
while (cc != '\n' && input != EOF);
fflush (stdin);
}
for(int i = 0; i < 6; i++)
{
std::cout <<text[i] << std::endl;
}

return 0;
}

Входной файл:

first
second
third
fourth
fifth
sixth

Выполнение команды:

.\main.exe < input

Вывод (обратите внимание на отсутствие первого символа в нескольких строках):

first
econd
hird
fourth
fifth
ixth

0

Решение

Задача ещё не решена.

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

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

По вопросам рекламы [email protected]