Я не могу смыть stdin
Как промыть stdin??
почему это не работает в следующем фрагменте кода?
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>
int main()
{
int i=0,j=0, sat;
char arg[256];
char * argq;
argq = malloc(sizeof(char)*10);
printf("Input the linen");
i=read(0, arg, sizeof(char)*9);
arg[i-1]='';
fflush(stdin);
i=read(0, argq, sizeof(char)*5);
argq[i-1]='';
puts(arg);
puts(argq);
return 0;
}
теперь, если я дам ввод как 11 символов, только 9 должны быть прочитаны, но оставшиеся два символа в stdin не сбрасываются и не читаются снова в argq. Почему?
вход: 123 456 789
выход: 123 456 89
почему я получаю этот 89 в качестве вывода?
7 ответов
Я считаю, что fflush используется только с выходными потоками.
вы можете попробовать fpurge или __fpurge на Linux. Обратите внимание, что fpurge нестандартен и не переносится. Она может быть недоступна для вас.
С Linux fpurge man page: обычно это ошибка, чтобы отказаться от входных буферов.
самым портативным решением для промывки stdin, вероятно, будет что-то вроде следующий:
int c;
while ((c = getchar()) != '\n' && c != EOF);
Как очистить stdin??
промывка входных потоков вызывает неопределенное поведение. Не пытайтесь.
вы можете только очистить выходные потоки.
вы не можете очистить stdin в Linux, не натыкаясь на сценарии, которые команда начнет ждать ввода в некоторых случаях. Способ его решения-заменить все std:: cin на readLineToStdString ():
void readLine(char* input , int nMaxLenIncludingTerminatingNull )
{
fgets(input, nMaxLenIncludingTerminatingNull , stdin);
int nLen = strlen(input);
if ( input[nLen-1] == '\n' )
input[nLen-1] = '';
}
std::string readLineToStdString(int nMaxLenIncludingTerminatingNull)
{
if ( nMaxLenIncludingTerminatingNull <= 0 )
return "";
char* input = new char[nMaxLenIncludingTerminatingNull];
readLine(input , nMaxLenIncludingTerminatingNull );
string sResult = input;
delete[] input;
input = NULL;
return sResult;
}
Это также позволит вам вводить пробелы в строку std::cin.