目录
2,读文件:read 从打开的⽂件中读取⽂件内容,然后输⼊到程序中去。
3,写入文件:write从程序中把内存数据写⼊到⽂件中,程序输出到⽂件中。
3.1,复制整个字符串内容粘贴到这个字符串,覆盖原字符串中所有的内容
3.2, 复制字符串中前n个字符串内容粘贴到原字符串,原字符串中的全部内容都会被覆盖。
IO文件系统
名词解释:
io:即input,output,文件的读写。
一,多文件编程
即用一个程序源代码把具有相同功能的程序添加在这个文件中,这就叫多文件编程。
编译机制:
① 预处理:gcc -E 文件名.c -o 文件名.i
② 编译:gcc -s 文件名.i -o 文件名.s
③ 汇编:gcc -C文件名.s -o 文件名.o
④ 链接:gcc 文件名.O
头文件:用于多文件书写时的声明。
头文件的格式:#include<xxx.h>或者#include"xxx.h"。注:""表示其他路径,<>表示当前路径的声明。
注:虽然是多文件编程但是在链接前各个步骤都是分别进行的,只是在运行程序时进行链接。
预处理命令:在编译过程中,在预处理阶段执行某一段操作,不执行其他段的代码。
格式 #if
#else
..............
#endif
宏定义:用当前的值代替其他的值区别于类型替换(typedef)
格式:#define n 10,即用n代表10。
注:宏定义同样只能执行替换一个语句,(即执行一个分号之前的语句)如果要同时使用多个语句可以使用do while语句或者把多个语句通过添加{ };进行更改。
do while 语句:第一次条件不做判断,从第二次开始执行判断。
格式:do
{
}while();
二,文件IO
程序操作磁盘上的文件就是对文件的读写操作
读:将磁盘中的文件放入到程序中来——>输入
写:将程序中的文件存放在磁盘中去——>输出
文件的操作
函数名含义的查看:man +函数名。
1, 文件的打开:open
1.1, 只打开文件
//要使用open 这个函数就必须对其声明。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//打开⽂件
int open(const char *pathname, int flags);
/*
参数1:
const char *pathname:字符指针,表⽰的是字符的地址,字符串的⾸地址,要打开的⽂件路径字符串的地址.
const:表示指向的指针地址可以进行修改。
参数2:
int flags:整数,打开⽂件的选项
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
O_TRUNC:清空⽂件(在有 写 ⽅式 有效)
O_APPEND:追加⽂件(在有 写 ⽅式 有效),在写⽂件时,在⽂件末尾位置添加写
O_CREAT:如果⽂件不存在则,创建⽂件,存在则直接打开。
返回值:
成功返回>=0
失败返回-1
*/
1. 2,创建且打开文件
int open(const char *pathname, int flags, mode_t mode);
2,读文件:read 从打开的⽂件中读取⽂件内容,然后输⼊到程序中去。
//文件声明
#include <unistd.h>
//格式:
ssize_t read(int fd, void *buf, size_t count);
/*
从指定的fd(打开的⽂件中,读取count个字节数据,存放到程序的内存buf地址开始位置)
参数1:
int fd:⽂件描述符,表⽰打开的⽂件
参数2:
void *buf:指针,表⽰把从⽂件中读取的内容,存放到程序指定的内存地址中
参数3:
size_t count:整数,表⽰从⽂件中读取多少个字节的数据内容
返回值:
成功:返回读取到的字节数,如果返回值为0表⽰本次读取是从⽂件末尾开始读取,没有内容
失败:-1
*/
3,写入文件:write从程序中把内存数据写⼊到⽂件中,程序输出到⽂件中。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
/*
把buf这个内存地址的中的数据,拿出 count字节数,写⼊到fd⽂件中。
参数1:
int fd:要写⼊哪个⽂件
参数2:
const void *buf:要写⼊的内容在哪个内存地址(把哪个内存地址的内容,写⼊⽂件)
参数3:
size_t count:要写⼊内容的⼤⼩
返回值:
成功:返回写⼊的字节数
失败:返回-1
*/
4,关闭文件:close把打开的⽂件关闭
#include <unistd.h>
int close(int fd);
/*
参数1:
int fd:⽂件描述符,表⽰关闭哪个打开的⽂件
返回值:
成功:返回0
失败:返回-1
*/
注:对于程序⽽⾔,系统默认打开了终端⽂件 终端⽂件打开了三次,分别以不同的⽅式打开。
⽂件描述符如下:
0:读打开,只读,可以读取终端⽂件内容(命令⾏输⼊的内容)
1:写打开,只写,可以写⼊到终端⽂件(终端上显⽰)
2:写打开,只写,以更⾼权限写,程序出错时,想⽴即显⽰
5,设置文件偏移位置:lseek
#include <sys/types.h>
#include <unistd.h>
//重新设置⽂件当前操作位置(修改偏移位置)
off_t lseek(int fd, off_t offset, int whence);//设置打开的fd⽂件的偏移位置
/*
参数1:
int fd:表⽰打开的⽂件,需要被设置偏移量的⽂件
参数2:
off_t offset:整数,偏移量,表⽰偏移多少个字节
+:正数,向⽂件末尾靠近偏移
-:负数,向⽂件开头靠近偏移
参数3:
int whence:基准点,表⽰从哪个位置开始计算如下
SEEK_SET:从⽂件开始位置计算偏移
SEEK_CUR:从⽂件当前的操作位置计算偏移
SEEK_END:从⽂件末尾位置开始计算偏移
返回值:
成功:返回从⽂件开始位置到新偏移之后位置⼀共多少个字节
失败:返回-1
*/
注:位置偏移可以超过当前⽂件⼤⼩,超过的文件大小的文件叫做空洞⽂件,中间空洞部分每个字节都 会补'\0'
三,目录操作
1,创建目录文件
命令:mkdir 在指定⽬录中创建⼀个⽬录⽂件
//头文件
#include <sys/stat.h>
#include <sys/types.h>
//格式:
int mkdir(const char *pathname, mode_t mode);
/*
参数1:
const char *pathname:指针,字符串⾸地址,要创建的⽬录⽂件的路径
参数2:
mode_t mode:创建的⽬录的权限(读写执⾏)
返回值:
成功:返回0
失败:返回-1
*/
举例说明:
2,删除目录文件
命令:rmdir 删除指定位置的文件目录
//头文件
#include <unistd.h>
//格式
int rmdir(const char *pathname);
/*
参数:
const char *pathname:字符串⾸地址,表⽰要删除的⽬录
返回值:
成功:返回0
失败:返回-1
*/
举例说明: