粤嵌实习-了解Linux中几个有关文件的函数(open()、write()、close()、lseek()文本间内容的复制和读取)

粤嵌实习(电梯运行演示系统)

了解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中会有残留数据。

在这里插入图片描述

在这里插入图片描述

预期结果如下:

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风-世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值