Я использую машину Unix, и я пытаюсь читать с консоли до тех пор, пока не будет достигнуто EOF (поставляю Ctrl + D). Я использую fread_unlocked. Для чтения ввода он выводит корреляцию целых чисел, но вместо нормального выхода он дает ошибку сегментации в EOF. Как мне изменить свой код так, чтобы он вел себя так, как ожидалось?чтение до EOF от стандартного ввода в c
int MAXX = 10000000;
char *ipos, InpFile[MAXX];
inline int input_int(int flag=0)
{
while(*ipos<=32)
++ipos;
if(flag)
return(*ipos++-'0');
LL x=0,neg=0;
char c;
while(true)
{
c=*ipos++;
if(c=='-')
neg=1;
else
{
if(c<=32)
return neg?-x:x;x=(x<<1)+(x<<3)+c-'0';
}
}
}
int main()
{
ipos = InpFile;
fread_unlocked(InpFile, MAXX, 1, stdin);
while(true){
int n = input_int();
printf("%d\n",n);
}
return 0;
}
Мой вход с консоли: 3 4 5 6Ctrl+D
Выходной сигнал я получаю сейчас: 3 4 5 6 Segmentation Error
Ожидаемый результат: 3 4 5 6
Спасибо.
На самом деле порядок аргументов 'fread()' (и, следовательно, 'fread_unlocked()' are 'size_t fread (void * ptr, size_t size, size_t nitems, FILE * stream);', поэтому 'fread() 'call будет возвращать 0, если пользователь не наберет символы« MAXX »(которых мы можем быть уверены, не произойдет, так как« MAXX »составляет 10 миллионов), возвращаемое значение из' fread() 'будет равно нулю. ('1, MAXX'), а затем вы получите полезную информацию. И да, я все еще смотрю на страницу man для' fread() ', прежде чем использовать ее каждый раз. –
@JonathanLeffler: Это отличный момент. обновил мой ответ, спасибо! – ruakh
спасибо за решение :) – pranay