系统预定义流指针

简介: 系统预定义流指针

当用户程序运行时,系统会自动打开 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);
目录
相关文章
|
3月前
|
运维
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
|
5月前
|
算法 Linux C语言
【Linux系统编程】深入理解Linux目录操作:文件夹位置指针操作函数(telldir,seekdir,rewinddir)
【Linux系统编程】深入理解Linux目录操作:文件夹位置指针操作函数(telldir,seekdir,rewinddir)
63 0
|
4月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
5月前
|
机器学习/深度学习 计算机视觉
LabVIEW开发自动读取指针式仪表测试系统
LabVIEW开发自动读取指针式仪表测试系统
49 7
|
5月前
|
设计模式 安全 Java
【Linux 系统】多线程(生产者消费者模型、线程池、STL+智能指针与线程安全、读者写者问题)-- 详解
【Linux 系统】多线程(生产者消费者模型、线程池、STL+智能指针与线程安全、读者写者问题)-- 详解
|
12月前
|
存储 Linux 编译器
Linux系统中指针的详细分析与操作
Linux系统中指针的详细分析与操作
111 1
|
12月前
|
JSON 数据格式 存储
No.12 gin框架中的binding究竟是干嘛的?(二)
No.12 gin框架中的binding究竟是干嘛的?
No.12 gin框架中的binding究竟是干嘛的?(二)
|
12月前
|
Go
No.19 干!系统崩溃,又空指针panic?(三)
No.19 干!系统崩溃,又空指针panic?
|
12月前
|
安全 Go
No.19 干!系统崩溃,又空指针panic?(二)
No.19 干!系统崩溃,又空指针panic?
|
12月前
|
存储 Go
No.19 干!系统崩溃,又空指针panic?(一)
No.19 干!系统崩溃,又空指针panic?