linux 系统中,文件IO的流程
文件IO有5个函数:open() read(),write(),close(),leek()。
write()函数编写,它等同printf()函数,但是引用的更为直接,它直接写到内核里面
是unsitd.h头文件里面包含
1、open-打开或者创建一个文件
open(char *, flag, mode)在fcntl.h文件中声明,函数的作用:创建或这打开文件
参数:最多三个参数
char * 包含有文件名和路径
flag 打开文件的方式
mode 创建文件的权限
flag | 功能 |
---|---|
O_RDONLY | 只读 |
– | – |
O_WRONLY | 只写 |
– | – |
O_RDWR | 读写 |
– | – |
O_CREAT | 创建一个文件 |
– | – |
O_EXCL | 检测文件是否存在 |
– | – |
O_TRUNC | 打开文件覆盖 |
– | – |
O_APPEND | 打开文件追加 |
编写一个open()函数,
open(传入的值,创建一个文件夹 | 具有读写权限 , 权限命令为777)
运行结果为
创建文件的权限:mode &(~umask)它是权限命令码和掩码的与得出的结果
返回值
成功 | 出错 |
---|---|
文件表述符 文件的ID号 | 返回-1 |
使用追加命令O_APPEND
编译后 将内容添加到b.c文件中,使用echo命令
echo 添加内容到 > 指定文件
运行文件./append
运行成功
write()函数-写一个数据到文件
write(int fd, void *buf, size_t count);在fcntl.h库文件中声明
参数 | 描述 |
---|---|
int fd | 当前文件的innode输入,就是写到哪个文件 |
– | – |
void *buf | 写的内容buf |
– | – |
sizeof_t | 写多少个字节sizeof_t |
返回值:实际读的字节数
例子
这里向b.c文件写入一个hello linux 字符串
编译运行
通过查看可以得到b.c文件里面的内容
read()函数和write()函数相同
编译运行结果,在这里read_buf读不出数据是因为在同一个文件中,写数据的时候指针已经往下移动,没有重新返回,所以读取的时候读到后面的数据,后面的数据为空
lseek()函数
所以我们这里引用到leek()函数 -读取一个文件的位置指针
lseek(int fd, off_t offste,int whence); 在sys/types.h unistd.h库中声明
作用:调整读写的位置指针
参数 | 描述 |
---|---|
int fd | 当前文件,写到那个文件 |
– | – |
off_t offset | 偏移量,每读写操作所移动的距离,单位是字节的数量,可正负,(正前移负后移) |
– | – |
int whence | 当前位置的基点,有三个标志: 1、SEEK_SET(文件的开头)2、SEEK_CUR(文件指针的当前位置)3、SEEK_END(文件的结尾) |
返回值:成功则返回文件指针的当前位置
错误则返回-1;
例子:
这里lseek(哪个文件,从哪里开始,文件起始命令);
第二位正数是向前移动2位,负为后移
CP命令函数的实现
这里把前面介绍的文件 I/O 操作综合起来,成为一个完整的文件操作范例。在这个范例 中,先以可写方式打开当前目录下的“hello.txt”文件,如果该文件不存在,则创建文件, 再往文件中写入一个字符串“Hello, welcome to linux world!”,把操作结果输出到终端后, 关闭文件。接着再次以只读模式打开该文件,读取刚才写入的数据,并把结果输出到终端, 最后关闭该文件。
创建 file_wr 目录,打开文本编辑器,输入如程序清单 11.8 所示的代码,命名为 file_wr.c 并保存到 file_wr 目录。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, char* argv[])
{
char sz_str[] = "Hello, welcome to linux world!";
char sz_filename[] = "hello.txt";
int fd = -1;
int res = 0;
char buf[128] = {0};
fd = open(sz_filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); /* 以只写、创建打开文件 权限模式 mode=0x664 */
if(fd < 0)
{
printf("open file \"%s\" failed, errno=%d.\n", sz_filename, errno);
return -1;
}
res = write(fd, sz_str, sizeof(sz_str)); /* 写文件 */
printf("write %d bytes to \"%s\".\n", res, sz_filename);
fsync(fd); /* 同步文件 */
close(fd); /* 关闭文件 */
fd = open(sz_filename, O_RDONLY); /* 从只读方式打开文件 */
if(fd < 0)
{
printf("open file \"%s\" failed,errno=%d.\n",sz_filename, errno);
return -1;
}
res = read(fd, buf, sizeof(buf)); /* 读文件 */
buf[res]='\0'; 36 printf("read %d bytes from file \"%s\", data=\"%s\"\n", res, sz_filename, buf);
close(fd);
return 0;
}
给 file_wr.c 制作一个 Makefile,用 make 命令来编译。回顾一下 10.2 节关于 Makefile 的内容,把那里介绍的 Makefile 范例复制到 file_wr 目录,修改 Makefile 文件前 3 个变量并 保存,改好后的 Makefile 如
进入 file_wr 目录,输入 make 命令,完成编译,运行程序,结果如图 所示