Проблема связана только с 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
Задача ещё не решена.
Других решений пока нет …