c ждать чтения стандартного ввода?

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

я имею:

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

поток:

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

может как-то так? (псевдокод):

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;
}

или их лучший подход?

или это просто плохая практика делать что-то таким образом? если да, то поясните


person tom91136    schedule 06.02.2012    source источник


Ответы (1)


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

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

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

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(), чтобы убедиться, что вы правильно используете интерфейс; Я не уверен, соответствует ли мое использование в приведенном выше коде тому, что вы хотите/нужно делать в коде.

person tbert    schedule 06.02.2012
comment
это именно то, что я хотел! Спасибо за ответ; есть ли в любом случае, что я могу рассчитать блок stdin? например: данные 0 -> 20 секунд -> данные 1 -> 16,2 секунды ->... - person tom91136; 10.02.2012
comment
Конечно; вы можете ознакомиться с gettimeofday(2) и друзьями и начать вычитать секунды/микросекунды из получаемых структур timeval. - person tbert; 10.02.2012