Чтение со стандартного ввода после чтения из файла - PullRequest
0 голосов
/ 18 июня 2019

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

while (fgets(buf, sizeof(buf), fp)!=NULL){
  main process...
}
while (fgets(buf, sizeof(buf), stdin)!=NULL){
  main process...
}

Этот формат работает, как я и предполагал. Тем не менее, основной процесс является довольно коротким кодом, и будет ли способ сократить его, чтобы я мог написать цикл while только один раз? Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 июня 2019

Если ваша проблема в том, что «основной процесс» состоит из множества строк кода, которые вы не хотите дублировать, самое простое решение - создать функцию, реализующую основной процесс.

Поскольку циклы while идентичны, за исключением указателя файла, вы также можете включить цикл while в функцию с указателем файла в качестве параметра (как в замечании Дэвида).

Затем вы должны добавить такую ​​функцию:

void process_input(FILE *input_handle) {
   char buf[1024];
   while (fgets(buf, sizeof(buf), input_handle) != NULL) {
      main process...
   }
}

И ваш оригинальный код должен быть заменен на:

process_input(fp);
process_input(stdin);
1 голос
/ 18 июня 2019

будет ли способ сократить это, чтобы я мог написать цикл while только один раз?

Нет.

Вы, конечно, можете абстрагировать код в функцию, которая принимает FILE* в качестве параметра, или расширять интерфейсы stdio самостоятельно ( пример ), но, как ни крути, ни один из стандартных В C ни в одной популярной реализации libc нет ничего похожего на дескриптор файла ARGV из perl или что-то, что позволяет открывать список файлов в виде единого потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...