系统IO
概述
由系统调用提供的API;
系统IO是底层接口,因此任何设备和文件最终都是可以通过系统IO来操作。
系统IO不提供缓冲区,意味着每次读写都必须进入内核,对于大数据量的读写操作会影响效率。
头文件:
#include <stdio.h>
#include <sys/types.h>
#incldue <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
一、打开文件 open
int open(const *pathname,int flags);
返回值: 文件描述符
参数1 : 文件名
参数2 : 打开方式
O_RDONLY 只读 O_WRONLY 只写
O_RDWRONLY 可读写 O_CREAT 创建文件(加权限)
O_TRUNC 清空原文件内容 O_APPEND 追加方式写入
O_EXCL 创建互斥
例子:
int fd = open("./a.txt",O_RDWR|O_CREAT,0777);
//0777是权限,若没有O_CREAT则不用写。
二、读文件 read
ssize_t read(int fd,void *buf,size_t count);
返回值: 成功读到的字数
参数1 : 文件描述符
参数2 : 存放读到的数据到buf中
参数3 : 读的最大长度
三、写文件 write
ssize_t write(int fd,void *buf,size_t count);
返回值: 成功写入的字数
参数1 : 文件描述符
参数2 : 写进文件的数据
参数3 : 写的最大长度
四、文件偏移 lssek
ssize_t lseek(int fd,off_t offset,int whence);
返回值: 文件指针实际偏移量
参数1 : 文件描述符
参数2 : 以whence为参照物的偏移量
参数3 : 参照位置
SEEK_SET 文件指针指向文件头 然后开始偏移
SEEK_CUR 文件指针指向文件当前位置 然后开始偏移
SEEK_END 文件指针指向文件末尾 然后偏移
注:对文件的读写都是从文件指针位置开始操作,打开文件时,文件指针默认指向文件头。读写操作都会影响文件指针的位置,所以读写操作后按需求进行指针偏移。
五、关闭文件
close(int fd);
标准IO
概述
由标准c库提供的API;
标准输入 FILE *stdin fread(char *buf,10,1,stdin);
标准输出 FILE *stdout fprintf(stdout,"%d %c",int ,char );
标准出错 FILE *stderr fprintf(stderr,"%d %c",int , char );
标准IO提供缓冲区,增加数据处理的吞吐量。
在能使用标准IO的场合,我们尽量使用它。
无法使用标准IO的场合(如驱动文件),我们还是只能用系统IO。
一、打开文件 fopen
FILE *fopen(const char *pathname,const char *mode);
返回值: FILE指针
参数1 : 文件名
参数2 : 打开权限
//文件必须存在,指针默认在文件头
"r"只读 "r+"读写
//文件不存在则创建,如果文件存储则会清空文件
"w"只写 "w+"读写
//文件不存在则创建,如果文件存储文件指针则指向文件末尾
"a"只写 "a+"读写
二、读文件 fread
size_t fread(char *buf,size_t size, size_t number,FILE *stream);
返回值: 成功读取的次数
参数1 : 存放读取的数据
参数2 : 一次读的长度
参数3 : 读多少次
参数4 : 要读取的文件的FILE指针
三、写文件 fwrite
size_t fwrite(char *buf,size_t size, size_t number,FILE *stream);
返回值: 成功写入的次数
参数1 : 写入文件的数据
参数2 : 一次写的长度
参数3 : 写多少次
参数4 : 要写入的文件的FILE指针
四、文件偏移 fsleek
int fseek(FILE *stream, long offset, int whence);
返回值: 成功返回0
参数1 : 要偏移的FILE指针
参数2 : 参照whence的偏移量
参数3 : 偏移参照物
SEEK_SET 文件头
SEEK_CUR 当前位置
SEEK_END 文件末尾
long ftell(FILE *stream); 获取文件偏移量
void rewind(FILE *stream); 把指针偏移到文件头
五、关闭文件 fclose
fclose(FILE *stream);