一、标准 I/O 的概念
标准 I/O 由 Dennis Ritchie 于 1975 年创建,是 C 语言的标准库之一,符合 ANSI C 规范。在输入方面,键盘是默认的标准输入设备(/dev/input
);在输出方面,显示器是默认的标准输出设备。在 Linux 操作系统中,I/O 操作本质上都是对文件的操作。标准 I/O 对普通文件的操作通常带有缓存,在文件 I/O 和用户程序之间加入缓冲区,能够有效减少系统调用的次数,提高效率,节省系统 I/O 调度资源。
二、文件相关
在 Linux 中,一切皆为文件,文件用于存储数据(包括数据和指令)。Linux 中的文件类型有 7 种,分别为:d
(目录)、-
(普通文件)、l
(符号链接)、p
(管道)、s
(套接字)、c
(字符设备文件)、b
(块设备文件)。
三、标准 I/O 的分类与相关函数
标准 I/O 是 ANSI C 设计的一组用文件 I/O 封装的操作库函数,其头文件为stdio.h
,位于/usr/include/stdio.h
。使用<>
包含头文件表示系统库函数,默认路径在/usr/include/
;使用""
包含头文件表示用户自定义函数,默认是当前路径。
常见的标准 I/O 函数众多,如printf
、scanf
、sprintf
、getchar
、putchar
、gets
、puts
、getc
、putc
、fgets
、fputs
、fread
、fwrite
、ftell
、rewind
、fseek
等。
四、文件操作步骤与缓冲区
文件操作一般包括打开文件、进行读写操作以及关闭文件。缓冲区分为行缓冲(1K,主要用于人机交互,如stdout
,在遇到\n
、缓冲区满、程序结束或使用fflush
时刷新)、全缓冲(4K,主要用于文件读写,在缓冲区满、程序结束或使用fflush
时刷新)和无缓冲(0K,主要用于出错处理信息输出,如stderr
,不对数据缓存直接刷新)。
五、文件打开与读写操作
打开文件使用fopen
函数,其根据不同的模式(如只读r
、读写r+
、只写w
、写读w+
、追加可写a
、追加读写a+
)进行操作,并返回相应的文件流指针。读写操作相关的函数丰富多样,如fgetc
/fputc
处理单个字符,fgets
/fputs
处理一行数据,fread
/fwrite
可自定义读写数据的大小。
六、函数的具体介绍
1.fputc
函数 向流中写入一个字符,成功返回写入的字符 ASCII 码值,失败返回EOF
。
2.fgetc
函数 从流中读取一个字符,成功返回读到字符的 ASCII 码值,读到文件末尾返回EOF
。
可以通过EOF
宏或feof()
函数来判断fgetc
函数是否到达文件结尾。
3.fgets
/fputs
函数 按行获取数据。fgets
函数从指定流中获取指定大小的文本数据并存入本地内存,fputs
函数则将本地内存中的数据写入指定流。gets
和fgets
存在一些区别,如gets
的安全性问题以及对\n
字符的处理方式等。
4.fread
和fwrite
函数用于二进制文件的读写。
对于fread
函数:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
,从指定的stream
流对象中获取指定个数和大小的数据块到本地内存。
对于fwrite
函数:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
,从本地内存取出指定个数和大小的数据块写入到指定的文件流对象中。