Вы могли бы просто иметь логический флаг, который, если установлен, вы вызываете fprintf
для печати в файл, или вы печатаете, используя printf
(который будет go для консоли).
Что-то вроде
bool print_to_file = false;
FILE *file;
print_to_file = get_print_to_file_choice();
if (print_to_file)
file = get_file_to_print_to();
// ...
if (print_to_file)
fprintf(file, "some text here...\n");
else
printf("some text here...\n");
Теперь вышесказанное легко реализовать, но сложно поддерживать. Что если строку нужно изменить? Затем вам нужно помнить, что нужно изменить оба для вызовов fprintf
и printf
.
Таким образом, вы можете поместить это в функцию, которая принимает в качестве аргументов переменную флага и файла вместе со строкой формата и аргументы. Эта функция может использовать варианты функций печати varargs (vfprintf
и vprintf
) и выполнять условие в функции. В вашем основном коде вы могли бы затем вызвать эту функцию вместо этого.
Возможно, что-то вроде
void my_printf(bool print_to_file, FILE *file, const char *fmt, ...)
{
va_list va;
va_start(va, fmt);
if (print_to_file)
vfprintf(file, fmt, va);
else
vprintf(fmt, va);
va_end(va);
}
// ...
my_printf(print_to_file, file, "Some text here...\n");
Возможны и другие решения, например, использование freopen
, как упомянуто в комментарии. Или вы можете просто напечатать в stdout
(с простым printf
) и затем перенаправить вывод в оболочке или командной строке в файл.