本文内容主要为Linux文件的基本操作:
打开文件:int open(const char *pathname, int flags);
文件写入:ssize_t write(int fd, const void *buf, size_t count);
文件读取:ssize_t read(int fd, void *buf, size_t count);
关闭文件:int close(int fd);
读写位置偏移量:off_t lseek(int fd, off_t offset, int whence);
open:
返回值:文件描述符
pathname:目标文件夹路径
flags:文件打开方式(只读、只写、可读可写...)
write/read:
返回值:读/写字节数
fd:文件描述符
buf:需要写如的字节内容/读取的内容
count:读/写字节大小
lseek:
fd:文件描述符。
offset:偏移量,以字节为单位。
whence:用于定义参数 offset 偏移量对应的参考值
返回值:位置偏移量
函数其余内容不再过多叙述,可通过命令man 2 函数名进行查看,例如:man 2 open
文件读写例程:
//open、write、read头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//close的头文件
#include <unistd.h>
int main(void)
{
char buff[1024] = {0};
int fd1,fd2;
int ret;
/****************************************************************************
* O_RDONLY 只读方式打开文件
* O_WRONLY 只写方式打开文件
* O_CREAT 如果文件不存在则创建文件
* O_DIRECTORY 如果指向不是目录,则OPEN失败
* O_EXCL 与O_CREAT一起使用,原子操作
* O_TRUNC 调用 open打开文件时会自动清空文件内容
* O_APPEND 对文件进行写操作时,自动把文件当前位置偏移量移动到文件末尾
* ************************************************************************/
//1.打开源文件,以只读的方式
fd1 = open("./ProFile",O_RDONLY);
if(fd1 == -1)
{
close(fd1);
return fd1;
}
//2.打开目标源文件,以只写的方式
fd2 = open("./testfile",O_WRONLY);
if(fd2 == -1)
{
close(fd1);
close(fd2);
return fd2;
}
//3.读取源文件数据
ret = read(fd1, buff, sizeof(buff));
if(ret == -1)
{
close(fd1);
close(fd2);
return ret;
}
//4.将读取源文件数据写入目标源文件
ret = write(fd2, buff, sizeof(buff));
if(ret == -1)
{
close(fd1);
close(fd2);
return ret;
}
//5.关闭文件
close(fd1);
close(fd2);
return 0;
}
说明:首先创建main.c函数,在当前目录再手动创建任意两个文本testfile和ProFile:
testfile为空文件,ProFile文件随便写入一些内容:
- 以只读的方式打开文件ProFile,打开失败则关闭文件,函数运行结束
- 以只写的方式打开文件testfile,打开失败则关闭文件,函数运行结束
- 从ProFile文件头开始,读取1024个字节数据存入buff中,读取失败,关闭文件,退出执行。
- 将buff中的数据写入文件testfile中,写入失败则关闭文件,退出函数。
- 文件操作完成,关闭文件
函数内容中,对open函数比较常用的指令进行了说明,需要熟练掌握。
输入 gcc -o main main.c对main.c函数进行编译,输入 ./main 运行,使用cat testfile可以看到文件ProFile的1024字节内容被写入testfile中,执行结果如下图:
lseek函数
lseek比较重要的标志已在函数中备注。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
char buff[512] = {0};
int fd1,fd2;
int ret;
//1.打开源文件,以只读的方式
fd1 = open("./ProFile",O_RDONLY);
if(fd1 == -1)
{
close(fd1);
return fd1;
}
//2.打开目标源文件,以只写的方式
fd2 = open("./testfile",O_WRONLY);
if(fd2 == -1)
{
close(fd2);
return fd2;
}
//3.指针偏移:从文件头开始计算1024位置
lseek(fd1, 1024, SEEK_SET);
//4.读取源文件数据
ret = read(fd1, buff, sizeof(buff));
if(ret == -1)
{
close(fd1);
close(fd2);
return ret;
}
/************************************************************
* SEEK_SET 读写偏移量将指向offset字节位置处(从文件头开始计算)
* SEEK_CUR 读写偏移量指向当前位置偏移量+offset字节位置处。
* SEEK_END 读写偏移量将指向文件末尾+offset字节位置处
* //offset可为正也可为负
***********************************************************/
//5.指针偏移:指向文件末尾
lseek(fd2, 0, SEEK_END);
//6.将读取源文件数据写入目标源文件
ret = write(fd2, buff, sizeof(buff));
if(ret == -1)
{
close(fd1);
close(fd2);
return ret;
}
close(fd1);
close(fd2);
printf("system run ok...\n");
return 0;
}
程序执行说明:
3.位置偏移至文件ProFile的第1024个字节处
4.从文件ProFile的第1024个字节处读取512个字节存入buff中
5.位置偏移至文件testfile的第1024个字节处
6.从文件testfile的第1024个字节处开始写入buff数据
可能出现的bug说明:
文件无法读写,如果文件是从windows系统传入Linux中的文件,那么该文件可能没有读写权限,可以通过chmod 777 文件名 给文件赋予权限,权限赋予失败则sudo chmod 777 文件名。
gcc -o main main.c 无法执行,需要安装gcc编译器,sudo apt install gcc。
如有不清楚以及文章内容错误的地方,欢迎留言指正,谢谢!