什么是标准输入输出
百度百科解释如下:
执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
stdin、stdout、stderr的文件描述符分别为0、1、2。
标准输入输出的特点
默认情况下,stdout在遇到换行符、缓冲区满或者程序结束时才会输出缓冲区内容,这意味stdout的内容可能不会及时显示。stderr是无缓冲的,内容直接显示在屏幕上。
程序测试
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
我们将看到只有hello-err每隔一秒输出,而没有hello-out。那么会一直都没有hello-out输出吗?答案是否定的。修改程序如下:
#include <stdio.h>
#include <unistd.h>
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 <stdio.h>
void main()
{
printf("1\n");
fprintf(stdout,"2\n");
fprintf(stderr,"3\n");
}
执行test.exe > 1.txt,输出及文件内容如下:
参考:
https://zhidao.baidu.com/question/98997227.html