stdout,stdin, stderr是一个C程序中默认开启的三个数据流(文章只介绍stdout, stdin.)
stdout -- 标准输出流 -- 屏幕
stdin -- 标准输入流 -- 键盘
stderr -- 标准错误流 -- 屏幕
我们写程序时,有时想把数据输出到屏幕上,有时想把数据输出到硬盘上,有时候想把数据输出到软盘上,有时想把数据输出到光盘上...
所以我们在写程序的时候会经常操控各种各样的硬件,硬件的不同,读写方式也不同,所以我们难道要懂得各种各样硬件的读写方式吗
所以在程序和硬件中间高度抽象了一个流的概念,我们只需要把数据丢给流,它帮我们来完成对应硬件的读写方式,我们就便利了许多。
一、stdout介绍
我们先看看printf()函数
函数
printf
int printf(const char* format, ...);
将格式化数据打印到标准输出
将格式指向的C字符串写入标准输出(stdout)。如果格式包含格式说明符(以“%”开头的子序列),则格式后面的附加参数将被格式化并插入到结果字符串中,以替换其各自的说明符。
这里提到了将指向的C字符串写入标准输出,
我们写printf("hello world!");就自动输出到屏幕上,就是因为printf()函数默认把(格式化)字符串输出到stdout流,也就是屏幕上。
与fprintf()函数比较
函数
fprintf
int fprintf(FILE* stream, const char* format, ...);
将格式化的数据写入流
将格式指向的C字符串写入流。如果格式包含格式说明符(以“%”开头的子序列),则格式后面的附加参数将被格式化并插入到结果字符串中,以替换其各自的说明符。
在format参数之后,函数需要至少与format指定的数量相同的附加参数。
我们可以用printf()和fprintf()作对比
fprintf()函数前面多了一个FILE* stream的参数,它表示的是流的意思。 前面说过,printf()是默认输出到stdout流,这里的fprintf()函数就可以自己设置输出到哪个流。
如果fprintf()函数的第一个参数是stdout, 可以等价于printf()函数。
二、stdin介绍
我们来看看scanf()函数和fscanf()函数的区别
函数
sacnf
int scanf(const char* format, ...);
从标准输入读取格式化数据
从stdin读取数据,并根据参数格式将其存储到附加参数所指向的位置。
附加参数应指向已分配的对象,该对象的类型由格式字符串中相应的格式说明符指定。
函数
fsacnf
int fscanf(FILE* stream, const char* format, ...);
从流中读取格式化数据
从流读取格式化数据从流读取数据,并根据参数格式将其存储到附加参数所指向的位置。
附加参数应指向已分配的对象,该对象的类型由格式字符串中相应的格式说明符指定。
我们不难得出,fscanf()函数的范围更加广一些,我们可以把第一个参数写成文件指针,那么我们可以从一个文件中读取到信息(fprintf()函数也可以第一个参数位文件指针,可以输出到文件当中,就不会显示到我们的屏幕上)。
当然,也可以是stdin,这和scanf()函数等价。