一、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;
}