C перенаправление программы в файл

У меня есть следующий код, и если я пытаюсь перенаправить его в файл, никаких запросов не выводится. Он перенаправляет как приглашение, так и результирующий вывод в мой файл.

Есть ли способ заставить его выводить подсказки на стандартный вывод, а затем выводить в файл?

/*prints chars in rows and columns*/
#include <stdio.h>

void display(char cr, int lines, int width); /*prototypes are fun*/

int main(void) {
    int ch; /*char to be printed*/
    int rows, cols; /*number of rows and columns*/
    printf("Enter a character and two integers.\n");

    while((ch = getchar()) != '\n') {
        if(scanf("%d %d", &rows, &cols) != 2) {
            break;
        }
        display(ch, rows, cols);
        while(getchar() != '\n') {
            continue;
        }
        printf("Enter another character and two integers. Newline quits.\n");
    }

    return 0;
}

void display(char cr, int lines, int width) {
    int row, col;
    for(row = 1; row <= lines; row++) {
        for(col = 1; col <= width; col++) {
            putchar(cr);
        }
        putchar('\n');
    }
}

2 ответа

Решение

Вы можете сделать имя файла (необязательным) аргументом командной строки.

Для этого вы бы изменили начало вашего main лайк:

int main(int argc, char** argv) {
  FILE* outfile;
  if (argc == 2) outfile = fopen(argv[1], "w");
  else outfile = stdout;

(Чтобы быть в безопасности, вы должны, вероятно, проверить, что outfile не равно нулю в случае ошибки при открытии файла. Вы также можете проверить наличие неправильного числа аргументов командной строки, создать сообщение справки и т. Д., В зависимости от того, для кого предназначена эта программа.)

Тогда вы должны пройти это FILE* к display функция, которая требует изменения подписи этой функции, как

void display(char cr, int lines, int width, FILE* outfile) {

И наконец, измените свой putchar звонки в putc так что вы можете отправить их в файл, как

putc('\n', outfile);

После всего этого, работает ваша программа, как

./myprog

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

./myprog file.txt

будет по-прежнему выводить подсказки на стандартный вывод, но другой вывод будет file.txt,

При работе с перенаправлением вывода в файл вы можете использовать freopen ().

Хотя это не хорошее решение, но это хороший пример того, как использовать freopen(), Предполагая, что вы пытаетесь перенаправить stdout в файл "output.txt", то вы можете написать -

freopen("output.txt", "a+", stdout);  

Здесь "+" для режима добавления. Если файл существует, то файл открывается в режиме добавления. В противном случае создается новый файл.

После повторного открытия stdout с freopen() все выходные заявления (printf, putchar) перенаправляются в файл "output.txt". Поэтому, когда вы пытаетесь перенаправить 'printf("Enter another character and two integers. Newline quits.\n");'оператор снова в терминале / командной строке, затем вы должны переназначить stdout снова используя следующий код:

freopen("/dev/tty", "w", stdout); /*for gcc, ubuntu*/  

или же

freopen("CON", "w", stdout); /*Mingw C++; Windows*/  

Вот полный код -

/*prints chars in rows and columns*/
#include <stdio.h>

void display(char cr, int lines, int width); /*prototypes are fun*/

int main(void) {
    int ch; /*char to be printed*/
    int rows, cols; /*number of rows and columns*/

    printf("Enter a character and two integersk.\n");

    while((ch = getchar()) != '\n') {
        if(scanf("%d %d", &rows, &cols) != 2) {
            break;
        }

        freopen("output.txt", "a+", stdout);
        display(ch, rows, cols);
        freopen("/dev/tty", "w", stdout); /*for gcc, ubuntu*/
        //freopen("CON", "w", stdout); /*Mingw C++; Windows*/

        printf("Enter another character and two integers. Newline quits.\n");
        while(getchar() != '\n') {
            continue;
        }
        fclose(stdout);
    }

    return 0;
}

void display(char cr, int lines, int width) {
    int row, col;

    for(row = 1; row <= lines; row++) {
        for(col = 1; col <= width; col++) {
            putchar(cr);
        }
        putchar('\n');
    }
    return;
}

Спасибо

Другие вопросы по тегам