繁体   English   中英

混淆stdin,stdout和stderr的工作方式

[英]Confused how stdin, stdout and stderr work

我有下面的程序,

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中工作

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

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

您也只能使用stdout ,并使用诸如tee的外部工具将输出复制到文件中。

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

会将您的stdout输出输出到文件myfile.txt此功能会将输出从控制台重定向到文件myfile.txt

即使您使用fclose(stdout); ,这不会将stdout的输出返回到控制台,只会关闭myfile.txt

有关更多详细信息,请参见以下链接。 在C中重定向stdout时的奇怪行为

为了同时在控制台和文件中获得输出,必须保持stdout freaopen() ,不要使用freaopen()重新打开它,也不要关闭它。 并且您必须在文件和标准输出中将消息打印两次

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

我已经为此类打印日志制作了一个宏。 该打印宏扩展了一个功能,该功能根据某些控制变量设置在我的日志文件和stdout或stderr中打印该消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM