Если ваша проблема в том, что «основной процесс» состоит из множества строк кода, которые вы не хотите дублировать, самое простое решение - создать функцию, реализующую основной процесс.
Поскольку циклы 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);