Буферизованное чтение из stdin с использованием fread в C - PullRequest
9 голосов
/ 03 марта 2010

Я пытаюсь эффективно читать из stdin, используя setvbuf в режиме `_IOFBF ~. Я новичок в буферизации. Я ищу работающих примеров.

Ввод начинается с двух целых чисел (n, k). Следующие n строки ввода содержат 1 целое число. Цель состоит в том, чтобы напечатать, сколько целых чисел делится на k.

#define BUFSIZE 32
int main(){
  int n, k, tmp, ans=0, i, j;
  char buf[BUFSIZE+1] = {'0'};
  setvbuf(stdin, (char*)NULL, _IONBF, 0);
  scanf("%d%d\n", &n, &k);
  while(n>0 && fread(buf, (size_t)1, (size_t)BUFSIZE, stdin)){
    i=0; j=0;
    while(n>0 && sscanf(buf+j, "%d%n", &tmp, &i)){
    //printf("tmp %d - scan %d\n",tmp,i); //for debugging
      if(tmp%k==0)  ++ans;
      j += i; //increment the position where sscanf should read from
      --n;
    }
  }
  printf("%d", ans);
  return 0;
}

Проблема в том, что если число находится на границе, буфер buf будет читать 23 из 2354\n, когда он должен либо прочитать 2354 (что не может), либо ничего вообще.

Как я могу решить эту проблему?


Редактировать
Решено сейчас (с анализом) .

Редактировать
Полная спецификация задачи

Ответы [ 11 ]

0 голосов
/ 03 марта 2010

Самый внешний цикл while() завершится, только когда чтение из stdin вернет EOF. Это может произойти только при достижении фактического конца файла во входном файле или при завершении процесса записи в канал ввода. Следовательно, оператор printf() никогда не выполняется. Я не думаю, что это имеет какое-либо отношение к звонку на setvbuf().

...