C-stdout和stderror及fprintf和printf区别

什么是标准输入输出

百度百科解释如下:

执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

stdin、stdout、stderr的文件描述符分别为0、1、2。

标准输入输出的特点

默认情况下,stdout在遇到换行符、缓冲区满或者程序结束时才会输出缓冲区内容,这意味stdout的内容可能不会及时显示。stderr是无缓冲的,内容直接显示在屏幕上。

程序测试

#include 
#include 
int main()
{
        while(1)
        {
                fprintf(stdout,"hello-out");
                fprintf(stderr,"hello-err");
                sleep(1);
        }
        return 0;
}

我们将看到只有hello-err每隔一秒输出,而没有hello-out。那么会一直都没有hello-out输出吗?答案是否定的。修改程序如下:

#include 
#include 
int main()
{
        int n=1000;
        while(n--)
        {
                fprintf(stdout,"hello-out");
                fprintf(stderr,"hello-err");
        }
        return 0;
}

此时我们将看到多个hello-err之后,出现连续的hello-out(可能不完整),将输出复制到vscode,我们将hello-out部分选中查看个数,可以看到正好是1024个字符,说明输出缓冲区大小是1024,如果输出缓冲区满了,缓冲区中的内容将输出到屏幕。

将n改为1,输出hello-errhello-out,说明程序结束时输出缓冲区的内容也会输出到屏幕。

fprintf和printf比较

printf是把格式字符串输出到标准输出,而fprintf是把格式字符串输出到指定文件设备中,可以是标准输出或者标准错误输出。

程序stderr和stdout输出写入文件区别

在将程序输出写入文件时,fprintf(stderr,"abc")的内容不会写入文件但会在屏幕输出,而fprintf(stdout,"abc")的内容会写入文件,但不会在屏幕输出。

#include 
void main()
{
	printf("1\n");
	fprintf(stdout,"2\n");
	fprintf(stderr,"3\n");
} 

执行test.exe > 1.txt,输出及文件内容如下:

C-stdout和stderror及fprintf和printf区别_第1张图片

 

参考:

https://zhidao.baidu.com/question/98997227.html

https://cloud.tencent.com/developer/ask/117195

https://baike.baidu.com/item/%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA/4714867?fr=aladdin

你可能感兴趣的:(C-stdout和stderror及fprintf和printf区别)