Linux-基础IO
文件的宏观理解:
狭义理解:
- 文件在磁盘里
- 磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的
- 磁盘是外设(即是输出设备也是输入设备)
- 磁盘上的文件 本质是对文件的所有操作,都是对外设的输入和输出 简称IO
广义理解:
- Linux下一切皆文件(键盘、显示器、网卡、磁盘……这些都是抽象化的过程)
文件操作的归类认知:
- 对于0KB的空文件是占用磁盘空间的
- 文件是文件属性(元数据)和文件内容的集合(文件=属性(元数据)+内容)
- 所有的文件操作本质是文件内容操作和文件属性操作
系统角度:
- 对文件的操作本质是进程对文件的操作
- 磁盘的管理者是操作系统
- 文件的读写本质不是通过C语言/C++的库函数来操作的(这些库函数只是为用户提供方便),而是通过文件相关的系统调用接口来实现的
文件IO相关操作
int fputs(const char *s, FILE *stream);
fputs函数是将s所指向的数据往stream中所指向的文件中写
char * fgets ( char * str, int num, FILE * stream )
注:
-
从流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件结尾,以先发生者为准。
-
换行符使 fgets 停止读取,但它被函数视为有效字符并包含在复制到 str 的字符串中。
-
在复制到 str 的字符之后会自动附加一个终止空字符。
-
fgets 与 get 完全不同:fgets 不仅接受流参数,还允许指定 str 的最大大小并在字符串中包含任何结束的换行符。
fwrite的使用方法
补充:
- 当前路径指的是每个进程,都有一个内置的属性cwd
- fwrite函数如果size_t count传入的数正好将字符串内容全部传入到指定文本中则返回count,否则返回与count不同的数
- fwrite函数传入内容的大小正好是size_t size,和size_t count的乘积
stdin & stdout & stderr
- 任何C程序,都默认打开三个文件分别叫做标准输入(stdin)、标准输出(stdout)、标准错误(stderr)
- 标准输入(stdin)——键盘文件——读方法(read)
- 标准输出(stdout)、标准错误(stderr)——显示器文件——写方法(write)
- Linux下一切皆文件
- 所有的外设硬件,本质是对应的核心操作无外乎是read和write(不同的硬件对应的读写方式是不一样的)
注:
- 可以通过C接口,直接对stdin、stdout、stderr进行读写
- C默认会打开三个输入输出流,分别是stdin, stdout, stderr,这样做便于语言进行上手使用,都有输入输出的需求
- 几乎所有的编程语言都会默认会打开三个输入输出流stdin, stdout, stderr,
- 任何一种编程语言的文件操作相关的函数(库函数)底层都会调用系统调用接口(open、close、write、read,这些在Linux系统下有,但这些接口不具备可移植性)
- 语言上相关文件操作的库函数兼容自身语法特征,系统调用使用成本较高,而且不具备可移植性
系统文件I/O
open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在