2013-02-09 3 views
0

Итак, я работаю над тем, что требует от пользователя, чтобы пользователь вводил столько, сколько они хотят в командном окне, включая новые строки, а затем после нажатия CTRL + D (символ EOF) I должен иметь возможность распечатывать все, что было напечатано.Подождите, пока EOF при использовании stdin

Я могу выяснить, как это сделать каждую новую строку.

#include <stdio.h> 

int main() 
{ 
    int C; 

    C = getc(stdin); 

    while(C != EOF) 
    { 
    putc(C, stdout); 
    C = getc(stdin); 
    } 

    return 0; 
} 

Я могу использовать только getc и putc. В конце концов я хочу, чтобы пользователь вводил столько, сколько они хотят, а затем в зависимости от флагов, которые они отправляют с помощью команды, я изменю ввод, который они дают мне, используя getopt.

EDIT: Извините, забыл добавить свой вопрос. То, что я хочу сделать, - это подождать, пока пользователь войдет во все свои данные, а затем распечатает все, а не линию за строкой. Как бы я это сделал.

+0

Итак, в чем ваш вопрос? –

+1

В Unix отсутствует символ «EOF», происходит то, что если пользователь вводит ctrl-D в tty, он обрабатывает это как конец файла, который должен быть передан на чтение процесса от него. – vonbrand

+0

Предпочитают строчные буквы для имен переменных. – pmg

ответ

0

Вы изучали использование терминалов? (Termios.h) вы можете установить стандартный ввод в, не канонические и режиме без эха, который позволит вам поймать каждую клавишу нажатой, включая управляющие символы

http://www.gnu.org/software/libc/manual/html_node/Noncanon-Example.html

3

Вы будете нуждаться в какой-то способ, чтобы буфер ввода пользователя (потому что они могут напечатать целый роман перед ударом Ctrl + D).

Вот пример того, как можно это сделать (обратите внимание, что чтение символов с помощью символов происходит очень медленно, и использование printf не будет обрабатывать вложенные NULs, так что вы можете использовать read и write вместо этого в «реальном» код):

size_t bufsize = 1024; // starting size 
char *buf = malloc(bufsize); 
off_t i = 0; 
char c; 

while((c = getc(stdin)) != EOF) { 
    buf[i++] = c; 
    if(i == bufsize) { 
     bufsize *= 2; // double buffer size to avoid constant reallocation 
     buf = realloc(buf, bufsize); 
     if(!buf) { 
      fprintf(stderr, "YOU TYPED TOO MUCH\n"); 
      exit(-1); 
     } 
    } 
} 

buf[i++] = 0; 
printf("%s", buf); 
+0

Любопытно: почему 'off_t i = 0;', а не 'size_t i = 0;'? Незначительный: нет необходимости в '++' в 'buf [i ++] = 0;'. – chux