一、文件IO
应用层 | 内核层 | 物理层 |
<1>应用层:只写逻辑代码
<2>内核层:接到应用层的指令,操作硬件
<3>物理层:根据内核层的需求去操作硬件
1.1、什么是IO
I就是input,O就是output,是指对内存的输入和输出,内存:速度快,数据掉电就丢失,贵;
外存(硬盘):速度慢,数据永久保存,掉电不丢失,便宜
1.2、如何使用IO
打开文件---读写文件---关闭文件
1.3、IO的分类
<1>文件IO:由系统提供的API接口,也被称为系统调用,每个系统的API接口都不一样,也就造成liunx系统下的执行文件移植到其他平台的话不能使用,因为接口不一致。
<2>标准IO:stdio.h---也称为标准c库函数,标准IO是在文件IO的基础上封装出来的。
1.4、常用的文件IO接口
<1>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:打开文件的方
必须包括:(三选一)
O_RDONLY:只读权限打开
O_WRONLY:只写权限打开
mode:附加参数
返回值:成功返回一个文件描述符
失败返回-1
<2>read
#include <unistd.h>
ssize_t read(int fd,woid *buf,size_t count);
<3>write
#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);
<4>lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd,off_t offest,int whence);
二、标准IO
标准IO就是标准C库函数提供额API接口,是在文件IO的基础上封装出来的,并且,标准IO在文件IO的基础上封装出一个叫缓冲区的东西,用来存放一些不是很着急的数据,等到缓冲区满,再调用一次文件IO完成写入或者读取工作。
果有些数据特别着急的,比如:下发的命令,实时监测的数据,必须使用文件IO
2.1、fopen
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
参数:
pathname:要打开的文件的路径
mode:打开文件的方式
r:以只读的方式打开一个文件,文件必须存在
r+:以读写的方式打开一个文件,文件必须存在
w :如果文件存在则清空写入,如果文件不存在则创建写入
w+:如果文件存在则清空读写,如果文件不存在则创建读写
a :如果文件存在则追加写入,如果文件不存在则创建写入
a+:如果文件存在则追加写入和读取,读取时从文件开头开始读取,写入时从文件末尾开始写入,lseek偏移后不能进行写入操作。
注意:有可能以后会遇到二进制文件 rb+,b:执行二进制操作,linux下无区分
返回值:
成功会返回一个文件流指针
失败返回NULL
2.2、fgetc
#include <stdio.h>
int fgetc(FILE *stream);
功能:从指定文件流指针中获取一个字符
参数:
stream:目标文件流指针
返回值:
成功会返回字符所对应的ascii
失败返回EOF
到达文件末尾:EOF
2.3、feof
#include <stdio.h>
int feof(FILE *stream);
功能:判断是否到达了文件末尾
参数:
stream:目标文件流指针
返回值:
如果到达文件的末尾会返回一个非0值
其它情况返回0
2.4、ferror
#include <stdio.h>
int ferror(FILE *stream);
功能:判断文件操作是否出错
参数:
stream:目标文件流指针
返回值:
如果文件操作失败,会返回一个非0值
其它情况返回0
2.5、fputc
#include <stdio.h>
int fputc(int c, FILE *stream);
功能:向指定的一个文件输出一个字符
参数:
c:想要写入的字符,将int转换成unsigned char类型的数据昔日如
stream:目标文件流指针
返回值:
成功:会返回字符所对应的ascii
失败返回EOF
2.6、fgets
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
功能:从指定文件获取一行字符(行读取)
参数:
s:读取的字节个数
size:读取的字节大小
stream:目标文件流指针
返回值:
成功:读到的字符串的首地址
失败:返回NULL
读到文件的末尾:返回NULL
2.7,fputs
#include <stdio.h>
int fputs(const char *s, FILE *stream);
功能:向一个文件进行字符串的输出
参数:
s:=想要写入数据的地址
stream:目标文件流指针
返回值:
成功:返回一个非负数
失败:返回EOF(-1)
2.8、fread
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:二进制读取文件
参数:
ptr:存放读到的数据的地址
size:对象的大小
nmemb:对象的个数
注意:总的读取的字节个数 = 对象的大小 * 对象的个数
stream:目标文件流指针
返回值:
返回值:成功返回读到对象的个数
失败返回:0
2.9、fweite
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:二进制写入文件
参数:
ptr:想要写入的数据的首地址
size:对象的大小
nmemb:对象的个数
stream:目标文件流指针
返回值:
返回值:成功返回写入对象的大小
失败返回:返回一个小的对象的个数
2.10、fseek
#include <stdio.h>int fseek ( FILE * stream , long offset , int whence );
#include <stdio.h>int sprintf ( char * str , const char * format , ...);
#include <stdio.h>int snprintf ( char * str , size_t size , const char * format , ...);
#include <stdio.h>int fprintf(FILE *stream, const char *format, ...);