c ожидание чтения stdin? - PullRequest
       31

c ожидание чтения stdin?

0 голосов
/ 06 февраля 2012

в моем приложении, я пытаюсь добиться чего-то вроде этого:

у меня есть:

  • данные 0, данные 1, данные 2, ... данные n.
  • некоторые параметры для передачи

поток:

  1. запускает программу с некоторыми параметрами и записывает данные 0 в стандартный ввод
  2. программа выполняет расчет по переданным данным «данные 0» и параметрам
  3. "ждать" нового стандартного ввода и (очистить старый стандартный ввод, буфер и переменные?)
  4. повторите 1 ~ 2, когда я добавлю данные 1, данные 2 ... и т. Д.
  5. когда достигнет данных n, завершиться (или, если я введу код сброса в stdin, сообщая программе о завершении).

может быть что-то вроде этого? (Псевдокод):

int main(int argc, char *argv[])
{
get parameters();
int fslen = data size
char *c = (char *)malloc(fslen);
fgets(c, fslen, stdin);

while((c != null) || (c != Terminate code?))
{       
    do calculations with int c;
    clear c;
}
return 0;
}

или их лучше подходить?

или это просто плохая практика так поступать? если да, пожалуйста, объясните

1 Ответ

1 голос
/ 06 февраля 2012

На самом деле нет лучшего способа, по крайней мере, насколько я знаю, читать и анализировать ввод строки, чем читать и анализировать ввод строки.

По умолчанию stdin должен блокироваться, поэтому ваш критерий ожидания должен быть обработан автоматически.

Однако вам понадобятся два цикла, если вы собираетесь читать строки, а затем анализировать строки для кодов:

int main(int argc, char *argv[])
{
    /* initial parameter/buffer setup goes here */

    while (fgets(buffer, bufferlen, stdin)) {
        for (c = buffer; *c != '\0' && *c != terminatingcode; c++) {
            /* calculations go here! ... they sure do! </homer> */
        }
        if (*c == terminatingcode || ferror(stdin))
           break;
    }
}

Имейте в виду, что fgets () может "потерпеть неудачу" здесь по совершенно невинным причинам, и вам необходимо ознакомиться с feof () и ferror (), чтобы убедиться, что вы используете интерфейс правильно; Я не уверен, согласуется ли мое использование в приведенном выше коде с тем, что вы хотите / нуждаетесь в коде.

...