linux文件IO
Linux下的7种文件属性:
- 普通文件 -
- 目录文件 d
- 符号链接文件(软链接): l
- 字符设备文件:c
- 块设备文件 :b
- 管道文件:p
- 套接字文件:
IO分为:
标准IO(高级磁盘IO):存在缓冲区 通过文件流(FILE)操作文件
文件IO(低级磁盘IO) :不存在缓冲区,通过文件描述符来(非负的数字)操作文件
文件被打开时会具备3个类:
stdin(标准输入--键盘)stdout(标准输出--终端) stderr(标准出错)会向终端打印
缓冲机制:
1.全缓冲:缓冲区被放满,程序结束,强制刷新--》会引起缓冲区的刷新
2.行缓冲:缓冲区被放满,程序结束,强制刷新,遇到换行符--》会引起缓冲区的刷新
3.不带缓冲:不存在缓冲区的概念---《每一次读写都是直接输出:stderr》
标准文件 IO
1.打开文件
函数 FILE* fopen(const char * path,const char*mode)
参数1:需要打开文件的名字(可以包含路径,指针类型)
参数2:打开文件的方式(指针类型)
返回值:
打开文件成功之后的文件流指针
失败为NULL
mode:
r/rb:打开只读 ,文件必须存在
r+/ r+b 打开文件可读可写,文件必须存在
w/wb 打开只写文件,注意文件不存在则新建 存在则会清空之前内容
w+、w+b wb+:打开可读可写 同上不存在新建,存在清空
a、ab:以附件方式打开只写文件,注:文件存在写的数据会追加文件尾 不存在新建
a+、a+b、ab+ 以附件方式打开,可读写注意同上
2.操作文件
(1)按照字符操作:fgetc fputs
int fgetc(FILE *stream);
功能:从指定的文件流中获取一个字符
参数:
指定获取一个字符所处文件的文件流
返回值:
成功返回获取到的字符值
读取到文件末尾返回EOF(-1)
操作中失败返回负数
int fputc(int c, FILE*stream);
功能:向指定的文件流中输出一个字符
参数:
参数1:需要输出的指定字符(字符被称为单字节的整形)
参数2:指定输出字符到的文件对应的文件流
返回值:
成功返回刚写入的字符值
失败返回EOF(-1)
(2)按照行操作
标志:寻找’\n’
函数: fgets fputs
函数原型:
char * fgets(char *s, int size, FILE *stream);
参数1 : 即将存储内存空间首地址
参数2:存储内容空间的大小(可以sizeof()测得)
参数3: 指定的文件流
返回值:
成功返回存储内容空间首地址
失败返回NULL
情况1:第一次遇到’\n’就会返回
情况2:该行会比较长,需要多次读取才能读完,所以位于读到’\n’之前的多次都是读取到size-1就返回。
(3)按块操作
fread() fwrite()
函数原型
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数1:存储读取一块内容之后的空间地址
参数2:块的大小---》建议给1
参数3:块的个数---》建议给sizeof()
参数4:要读取的文件对应的文件流
返回值:成功代表读取的块的个数,失败返回0
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
参数1:需要写入的内容的空间地址
参数2:块的大小---》建议给1
参数3:块的个数---》建议给sizeof()
参数4:要写入的文件对应的文件流
返回值:成功代表写入的块的个数,失败返回0
定位流
fseek()
参数1 文件流
参数2 偏移位置 以参数3文件指针流偏移多少
参数3 基准 SEEK_SET以文件首为基准
SEEK_CUR 以当前为基础
SEEK_END 以文件尾为基准
ftell()获取当前文件位置
rewind()设定文件位置为文件开始
perror(“string”);---》可以输出出错的原因
eof(FILE* Stream);
作用:判断文件是否抵达末尾(不管是文本文件还是二进制文件,都可以判断)
返回值:
抵达文件末尾---》返回值为非零
未抵达文件末尾---》返回值0
关闭文件
fclose(FILE*stream)
文件IO
文件IO使用的函数比较少,
open close read write
打开文件
int open(const char *pathname, int flags, mode_t mode);
功能:打开指定的文件
参数:
参数1:所需打开文件的名字(包含路径)
参数2:打开文件的方式---》主标志 | 副标志
参数3:当需要O_CREAT时,就要写该参数来为创建的新文件指明权限(八进制表示)
文件操作
写文件
ssize_t write(int fd, const void *buf, size_t count);
功能:向指定的文件描述符的文件内写入内容
参数:
参数1:打开文件之后的文件描述符
参数2:所需写入的内容所在空间首地址
参数3:需要写入的字节数
返回值:
成功返回写入的字节数
返回0代表没有写入任何内容
返回-1代表出错(errno is set...)
读文件
ssize_t read(int fd, void *buf, size_t count);
功能:从指定的文件描述符的文件中读取内容
参数:
参数1:打开文件之后的文件描述符
参数2:存储读取到结果的空间首地址
参数3:可以读取的字节数---》sizeof测得
返回值:
成功返回读取的字节数
返回0代表读取完毕
返回-1代表出错(errno is set...)
文件定位
关闭文件
int close(int fd)
总结:
标准IO
使用的函数带f 文件IO不带f 操作流程一般就是打开文件 返回一个文件流或者文件描述符
然后对相应进行读写操作 然后 关闭文件。注意:在对同一个文件读写操作时注意文件描述符的位置在哪!!!!
目录操作
opendir readdir closedir
制作静态库和动态库
库时一种可执行代码的二进制形式,可以被操作系统载入内存执行,
静态库:在程序编译会被链接到目标代码中,运行时将不需要该静态库,因此体积表大
动态库:动态在程序编译不会被链接,而是在程序运行时带载入,体积小