文章目录
粤嵌实习(电梯运行演示系统)
了解Linux中几个有关文件的函数
1.open()
用man查看open函数
通过阅读手册,我们能得出:
pathname : 文件路径
flag: 参数
O_CREAT: 如果不存在文件,那么就创建文件
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写
返回值: 文件描述符(整数),这个文件描述符很重要 接下来的系统调用都会用到。
2.close()
用man查看close函数
参数:文件描述符。
作用:关闭一个打开的文件。
3.write()
用man查看write函数
count:读取的字节数 (想到要)
fd:文件描述符
buf:缓冲区
返回值: 成功 返回你读取到的字节数 (实际的)
失败 返回-1
应用:运用open(),write(),close(),对一个已存在的txt文件进行写入数据。
如:对共享文件夹exampleowc.txt中写入“这是一个简单的写入操作”
注意计算字节数。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
unsigned char buf[1024]={"这是一个简单的写入操作"};
int fd = open("./exampleowc.txt",O_RDWR);//./代表当前目录
if(fd == -1)
{
printf("open fail!\n");
}
int ret1 = write(fd, buf, 33);
close(fd);
}
执行结果如下:
4.lseek()
用man查看lseek函数
fd:文件描述符
offset:偏移量
whence:从哪里开始偏移
SEEK_SET:文件头
SEEK_CUR:目前光标位置
SEEK_END:文件末尾
应用:将一个文件中的内容复制到另一个不存在的文件中(即用代码创建一个新的文件)并读出文件的后五个字符。
如:有文件prev.txt,“这是一句需要复制的句子”,十一个汉字。
需将其复制到copy.txt中,并从copy.txt中读出后五个字,即“复制的句子”。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
unsigned char buf[1024]={"1"};//表示初始buff中存在一个数据 1
//打开prev文件
int fd = open("./prev.txt",O_RDWR);//./代表当前目录
if(fd == -1)
{
printf("open fail!\n");
}
//创建打开copy文件
int fd1 = open("./copy.txt",O_RDWR|O_CREAT);//./代表当前目录
if(fd1 == -1)
{
printf("Creat fail!\n");
}
//从prev文件中读取33个字节数
int ret = read(fd, buf, 33);//从fd代表的文件中读取33个字节数
if(ret == -1)
{
printf("read fail!\n");
}else
{
printf("real read byte = %d\n",ret);
printf("buf=%s\n",buf);
}
//向copy文件中写入33个字节数
int ret2 = write(fd1, buf, 33);//向fd1代表的文件中写入30个字节数
if(ret2 == -1)
{
printf("write fail!\n");
}else
{
printf("real write byte = %d\n",ret2);
printf("buf=%s\n",buf);
}
//指针偏移至距离起始位置(0)的18字节处
lseek(fd1,18, SEEK_SET);//光标移动到第18字节处
unsigned char buf1[1024]={"0"};//表示一个初始buff中存在一个数据 0
int ret3 = read(fd1,buf1,15);//从文件描述符代表的文件中读取15个字节数
if(ret3 == -1)
{
printf("read fail!\n");
}else
{
printf("real read byte = %d\n",ret3);
printf("buf1=%s\n",buf1);
}
close(fd);
close()
}
注意:1.当向copy文件中写入文件后,指针在文件的末尾,此时不偏移指针直接读取将无法读取到数据。
2.若使用同一个buff,则若buff中的数据长于需要读取的数据,读取的数据依然放在相同的buff中,则不会完全覆盖buff,即最后打印的buff中会有残留数据。
预期结果如下: