简单基础"/>
IO的简单基础
一、C中文件接口。
- c中文件接口又称标准IO接口。
- fopen():
-
FILE * fopen ( const char * filename, const char * mode );
参数:
①filename: 是一个字符串,它包含文件名。
②mode: 也是字符串,表示的是访问模式。
访问模式:- “r” 以只读方式打开文件,该文件必须存在。
- “w” 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
- “w+” 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
- “a” 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
- “a+” 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
- “wb” 只写打开或新建一个二进制文件,只允许写数据。
- “wb+” 读写打开或建立一个二进制文件,允许读和写。
- “ab” 追加打开一个二进制文件,并在文件末尾写数据。
- "ab+"读写打开一个二进制文件,允许读,或在文件末追加数据。
③返回值:
文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
- fwrite():
-
返回值:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);-- buffer:指向数据块的指针-- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)-- count:数据个数-- stream:文件指针
- fread():
-
返回值:size_t fread(void *buffer, size_t size, size_t count, FILE *stream);-- buffer:指向数据块的指针-- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)-- count:数据个数-- stream:文件指针
- fseek():
-
重定位流(数据流/文件)上的文件内部位置指针,把文件指针指向文件的开头。int fseek ( FILE * stream, long int offset, int origin );
stream:文件指针;
offset : 偏移量,有正负偏移量之分。
origin:文件从哪里开始偏移,
可能取值为:SEEK_CUR、SEEK_END 或 SEEK_SET
0 / SEEK_SET:文件开头
1 / SEEK_CUR:当前位置
2 / SEEK_END:文件结尾
- fclose():
-
stream:文件指针。int fclose ( FILE * stream );
二、系统文件接口IO。
-
int open(char* filename,int flog,int mode)--filename:文件名称;--flog:可选参数;--mode :权限;
可选参数:
O_CRECT:文件存在打开,不存在创建;
O_EXCL:通常与O_CREAT同时使用,文件不存在创建,已存在报错返回。
O_TRUNC:打开文件的同时,清空文件原内容。
O_APPEND:写入数据时,写在文件末尾。
返回值:正整数,也就是文件描述符,文件的操作句柄。(失败返回-1) -
ssize_t : 有符号整型;size_t :无符号整型;ssize_t write(int fd,char* data,size_t count)--fd:文件描述符;--data:写入的首地址;--count:写入的长度;
返回值:
错误反回-1;
>0:则是写入的长度(可能不等于实际)。 -
off_t lseek(int fd,off_t offset,off_t whence)--fd:文件描述符;--offset:偏移量大小;--wnence:偏移起始位置。
返回值:-1:表示出错;>0:偏移长度。
-
ssize_t read(int fd,char* buf,size_t count)--fd:文件描述符;--buf:缓冲区首地址;--count:读取文件的大小
返回值:读取的文件长度;错误返回-1;==0:读到文件末尾。
-
头文件:#incude<unistd.h>close(fd);
fd :文件操作符。
注意事项:
如果open使用可选参数O_CERAT,则需要加入权限参数。例如:(0777),前面的0不能丢了。
三、文件描述符和重定向
(一)、文件描述符:
- 文件描述符实际上是内核中一个描述信息结构体的数组下标,通过PCB找到files_struct,再找到struct file* fd_carry[],从而找到文件。
- 一个程序运行,默认打开了三个文件:标准输入I(0),标准输出O(1),标准错误(2)。
- 库函数封装了系统调用接口。
-
文件流指针是一个结构体,并且这个结构体中封装了一个对象就是文件描述符。
-
我们通常所说的缓冲区,其实也是每一个file结构体中自带的缓冲区,用户态缓冲区。
用户态:当前程序运行的是程序员自己写的代码,则程序运行于用户态。
内核态:当前程序运行的程序为系统调用,即操作系统实现的功能,则程序运行于内核态。
(二)、重定向:
-
重定向符号:
> :输出重定向到一个文件或设备 覆盖原来的文件
>! :输出重定向到一个文件或设备 强制覆盖原来的文件
>> : 输出重定向到一个文件或设备 追加原来的文件
< : 输入重定向到一个程序 -
标准错误重定向符号:
2> : 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件 b-shell
2>> : 将一个标准错误输出重定向到一个文件或设备 追加到原来的文件
2>&1 : 将一个标准错误输出重定向到标准输出 注释:1 可能就是代表 标准输出
>& : 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件 c-shell
|& : 将一个标准错误 管道 输送 到另一个命令作为输入 -
命令重导向:
在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:
标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>
错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>
更多推荐
IO的简单基础
发布评论