嵌入式应用编程-IO读写关闭


一、write 写文件

调用 write 函数可向打开的文件写入数据,其函数原型如下所示

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

fd:文件描述符。关于文件描述符
buf:指定写入数据对应的缓冲区。
count:指定写入的字节数。
返回值:如果成功将返回写入的字节数(0 表示未写入任何字节),如果此数字小于 count 参数,这不
是错误,譬如磁盘空间已满,可能会发生这种情况;如果写入出错,则返回-1。

二、 read 读文件

调用 read 函数可从打开的文件中读取数据,其函数原型如下所示

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

fd:文件描述符。与 write 函数的 fd 参数意义相同。
buf:指定用于存储读取数据的缓冲区。
count:指定需要读取的字节数。

三、 close 关闭文件

可调用 close 函数关闭一个已经打开的文件,其函数原型如下所示

#include <unistd.h>
int close(int fd);

四、 lseek

lseek用于移动偏移量,我们先来看看 lseek 函数的原型

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

offset:偏移量,以字节为单位
whence:用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种(宏定义):

SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算);
SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处,offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负,如果是正数表示往后偏>>移、如果是负数则表示往前偏移。

4.1 lseek 使用示例:

(1)将读写位置移动到文件开头处:

off_t off = lseek(fd, 0, SEEK_SET);
if (-1 == off)
return -1;

(2)将读写位置移动到文件末尾:

off_t off = lseek(fd, 0, SEEK_END);
if (-1 == off)
return -1;

(3)将读写位置移动到偏移文件开头 100 个字节处:

off_t off = lseek(fd, 100, SEEK_SET);
if (-1 == off)
return -1;

(4)获取当前读写位置偏移量:

off_t off = lseek(fd, 0, SEEK_CUR);
if (-1 == off)
return -1;

五、 练习

打开一个已经存在的文件(例如 src_file),使用只读方式;然后打开一个新建文件(例如 dest_file),
使用只写方式,新建文件的权限设置如下:
文件所属者拥有读、写、执行权限;
同组用户与其他用户只有读权限。
从 src_file 文件偏移头部 500 个字节位置开始读取 1Kbyte 字节数据,然后将读取出来的数据写入到
dest_file 文件中,从文件开头处开始写入,1Kbyte 字节大小,操作完成之后使用 close 显式关闭所有文件,
然后退出程序。

Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
文件名 : testApp_1.c
作者 : 邓涛
版本 : V1.0
描述 :
论坛 : www.openedv.com
日志 : 初版 V1.0 2021/01/05 创建
***************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void) {
 char buffer[1024];
 int fd1, fd2;
 int ret;
 /* 打开 src_file 文件 */
 fd1 = open("./src_file", O_RDONLY);
 if (-1 == fd1) {
 printf("Error: open src_file failed!\n");
 return -1;
  }
 /* 新建 dest_file 文件并打开 */
 fd2 = open("./dest_file", O_WRONLY | O_CREAT | O_EXCL,
 S_IRWXU | S_IRGRP | S_IROTH);
 if (-1 == fd2) {
 printf("Error: open dest_file failed!\n");
 ret = -1;
 goto err1;
 }
 /* 将 src_file 文件读写位置移动到偏移文件头 500 个字节处 */
 ret = lseek(fd1, 500, SEEK_SET);
 if (-1 == ret)
 goto err2;
 /* 读取 src_file 文件数据,大小 1KByte */
 ret = read(fd1, buffer, sizeof(buffer));
 if (-1 == ret) {
 printf("Error: read src_file filed!\n");
 goto err2;
 }
 /* 将 dest_file 文件读写位置移动到文件头 */
 ret = lseek(fd2, 0, SEEK_SET);
 if (-1 == ret)
 goto err2;
 /* 将 buffer 中的数据写入 dest_file 文件,大小 1KByte */
 ret = write(fd2, buffer, sizeof(buffer));
 if (-1 == ret) {
 printf("Error: write dest_file failed!\n");
 goto err2;
 }
 printf("OK: test successful\n");
 ret = 0;
err2:
 close(fd2);
err1:
 close(fd1);
  return ret; 
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值