困惑stdin,stdout和stderr如何工作

时间:2013-04-04 10:29:13

标签: c file stdout stdin stderr

我有以下程序,

void Print()
{
    printf("\nCall from Print\n");
}

int main()
{
    FILE * pFile;
    char mystring [100];

    pFile = freopen ("myfile.txt" , "r", stdin);
    if (pFile == NULL)
    {
        perror ("Error opening file");
    }
    else 
    {
        if ( fgets (mystring , 100 , pFile) != NULL )
        {
            freopen("myfile.txt" , "a", stdout);
            Print();
            printf("Here it is\n");
            //puts (mystring);
        }
        fclose(stdout);
        fclose (pFile);

    }
    printf("Hello World\n");
    return 0;
}

现在当我正在执行程序时,我无法在控制台窗口中看到输出。所有输出都重定向到myfile.txt文件。我希望输出也应同时包含consolemyfile.txt

毕竟为什么printf("Hello World\n")没有在控制台中打印出来。 如何在控制台中打印?

我的工作在windows-7,visual studio-2010

3 个答案:

答案 0 :(得分:3)

最简单的方法是通过手动打印到stdout(原始,输出到控制台)和文件来更加明确。

通过重新打开stdout指向该文件,您将删除与控制台窗口的连接,这就是没有输出的原因。

您也可以 使用stdout,并使用tee之类的外部工具将输出复制到文件中。

答案 1 :(得分:3)

freopen("myfile.txt" , "a", stdout);

会将stdout输出到文件myfile.txt 此函数会将控制台的输出重定向到文件myfile.txt

即使您使用fclose(stdout);,也不会将stdout的输出备份到控制台,它只会关闭myfile.txt

有关详细信息Strange behaviour when redirecting stdout in C

,请参阅以下链接

为了在控制台和文件中获取输出,你必须保持stdout触发不要用freaopen()重新打开它并且不要关闭它。你必须在文件和标准输出中打印你的消息两次

答案 2 :(得分:0)

我也曾遇到过这样的要求。

我为这样的打印日志制作了一个宏。该打印宏扩展为一个函数,该函数在我的日志文件和stdout或stderr中打印该消息,具体取决于某些控制变量设置。