当用户程序运行时,系统会自动打开 3
个流指针,他们分别是:标准输入流指针stdin
、标准输出流指针stdout
和标准错误输出流指针stderr
,其类型与FILE *fp的类型是一致的,都属于流指针。唯一不同的是FILE *fp为程序自定义,需要将其与文件建立关联(将文件打开,得到返回值),而这三个流指针默认操作的不是文件,而是终端。
stdin作为标准输入流指针,默认是终端输入,而stdout、stderr同属于标准输出,默认是终端输出(不同之处在于是否操作缓存区)。因此,结合之前使用的标准I/O函数接口可以实现对终端的操作。
示例
采用字符的形式实现终端的输入与输出。
#include <stdio.h> int main(int argc, const char *argv[]) { int ch; while ((ch = fgetc(stdin)) != EOF) { fputc(ch, stdout); } return 0; }点击复制复制失败已复制
运行结果如下所示:
$ gcc main.c && ./a.out fdsfass fdsfass fff fff点击复制复制失败已复制
每次输入一行字符串,系统则打印输出一行相同的字符串。
采用字符串的形式实现终端的输入与输出
#include <stdio.h> #define N 32 int main(int argc, const char *argv[]) { char buf[N] = ""; while (fgets(buf, N, stdin) != NULL) { fputs(buf, stdout); } return 0; }点击复制复制失败已复制
效果与上面一致。
预定义流指针函数
标准I/O函数提供了一些默认使用系统预定义流指针的函数, getchar()
、 putchar()
、 gets()
、 puts()
等。函数默认使用流指针,因此不用将预定义流指针作为参数传递给这些函数。
getchar()
函数用于读取标准输入流指针(读取终端输入),每次操作一个字符,效果相当于 fgetc(stdin)
。
#include <stdio.h> int getchar(void);点击复制复制失败已复制
putchar()
函数用于向标准输入流指针写入(向终端输出),每次操作一个字符,效果相当于 fputc(stdout)
。
#include <stdio.h> int putchar(int c);点击复制复制失败已复制
gets()
函数是一个不推荐使用的函数。不同于 fgets()
函数的是, fgets()
函数指定了期望读取的字节数 size
,读取成功将 size-1
个字符送入缓存 s
中。但是 gets()
函数完全没有指定这一重要信息,如果读取的字符串长度大于缓存的长度,可能会造成不可预计的结果。
#include <stdio.h> char *gets(char *s);点击复制复制失败已复制
puts()
函数用于向标准输出流指针写入字符串(向终端输出),与 fputs()
函数不同的是, fputs()
函数向流指针写入字符串不会自动补充新的换行符,而 puts()
函数会自动再补充一个新的换行符在写入字符串的末尾。
#include <stdio.h> int puts(const char *s);