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;
}
Спасибо