2016-02-06 5 views
0

Я пытаюсь перебрать stdin, но поскольку мы не можем знать длину stdin, я не уверен, как создать цикл или какое условие использовать в нем.Loop over stdin in C

В основном моя программа будет передана по некоторым данным. Каждая строка данных содержит 10 символов данных, с последующим разрывом строки (So 11 символов в строке)

В псевдокоде, что я пытаюсь выполнить:

while stdin has data: 
    read 11 characters from stdin 
    save 10 of those characters in an array 
    run some code processing the data 
endwhile 

Каждая петля время цикл переписывает данные в те же 10 байтов данных.

До сих пор я понял, что

char temp[11]; 
read(0,temp,10); 
temp[10]='\0'; 
printf("%s",temp); 

примет первые 11 символов из стандартного ввода, и сохранить его. Позднее printf будет заменен большим количеством кода, который анализирует данные. Но я не знаю, как инкапсулировать эту функциональность в цикле, который будет обрабатывать все мои данные из stdin.

Я попытался

while(!feof(stdin)){ 
    char temp[11]; 
    read(0,temp,11); 
    temp[10]='\0'; 
    printf("%s\n",temp); 
} 

но когда это дойдет до последней строки, он продолжает повторно печатать его без прекращения. Любые рекомендации будут оценены.

+4

Вы смешиваете в буфер и небуферизованный ввод/вывод (чтение() не является буфером , поэтому feof (по-видимому, никогда не запускается). Попробуйте fread(). Также: проверьте свои возвращаемые значения! Что читает() return? –

+1

Вас, возможно, заинтересует этот вопрос: http://stackoverflow.com/questions/5431941/ почему-is-while-feof-file-always-wrong. В двух словах: конец условия файла обнаруживается только во время попытки чтения, цикл должен быть оставлен в этом случае после чтения, потому что буфер не содержит значимые данные. –

+0

См. ['While (! Feof (stdin))' всегда ошибочно] (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) для обсуждения того, почему вы не знаете, t напишите свой цикл таким образом. Кроме того, вы читаете из дескриптора файла 0, поэтому стандартные функции ввода-вывода не будут знать, достигли ли вы EOF или нет. Проверьте результат возврата из 'read()'; он сообщает вам, сколько символов он читает. Он возвращает 0 на EOF и -1 на другие ошибки. Который, помимо URL-адреса, во многом совпадает с тем, что написал Питер А Шнайдер. Вы можете сделать лучше с 'fgets()' или 'fread()'. Это зависит, в частности, от данных. –

ответ

1

Поскольку вы упоминаете разрывы строк, я предполагаю, что ваши данные являются текстом. Вот один из способов, когда вы знаете длины линий. fgets тоже читает newline, но это легко игнорировать. Вместо того, чтобы пытаться использовать feof, я просто проверяю возвращаемое значение от fgets.

#include <stdio.h> 

int main(void) { 
    char str[16]; 
    int i; 
    while(fgets(str, sizeof str, stdin) != NULL) { // reads newline too 
     i = 0; 
     while (str[i] >= ' ') {      // shortcut to testing newline and nul 
      printf("%d ", str[i]);     // print char value 
      i++; 
     } 
     printf ("\n"); 
     str[i] = '\0';        // truncate the array 
    } 
    return 0; 
} 

Программа сессия (закончилась Ctrl-Z в консоли Windows, Ctrl-D в Linux)

qwertyuiop 
113 119 101 114 116 121 117 105 111 112 
asdfghjkl; 
97 115 100 102 103 104 106 107 108 59 
zxcvbnm,./ 
122 120 99 118 98 110 109 44 46 47 
^Z