C程序重定向到文件

时间:2014-07-09 01:21:57

标签: c io-redirection

我有以下代码,如果我尝试将其重定向到文件,则不会输出任何提示。它将提示和结果输出重定向到我的文件。

有没有办法让它输出提示到stdout然后输出到文件?

/*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 个答案:

答案 0 :(得分:1)

您可能希望将文件名设为(可选)命令行参数。

要执行此操作,您可以更改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

仍会将提示打印到stdout,但另一个输出将转到file.txt

答案 1 :(得分:0)

在处理重定向输出到文件时,您可以使用freopen()

虽然它不是一个好的解决方案,但它是一个很好的例子,如何使用freopen()。假设您尝试将stdout重定向到文件&#39; output.txt&#39; ,那么您可以写 -

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

此处&#34; a +&#34; 用于追加模式。如果文件存在,则文件以追加模式打开。否则会创建一个新文件。

重新打开stdoutfreopen()所有输出语句(printfputchar)重定向到&#39; output.txt&#39; 即可。因此,当您尝试在终端/命令提示符中再次重定向'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;
}

由于