文件编程(2)底层文件IO操作

来源:互联网 发布:淘宝店铺头像在哪里换 编辑:程序博客网 时间:2024/05/01 08:46

这些函数的特点是不带缓存,直接对文件进行读写操作。不是ANSI C的组成部分,但是posix标准的组成部分。

一.核心理论:文件描述符
(1)成年公民有身份证编号
(2)打开的文件对应文件描述符。
(3)实质就是一串数字。
(4)作用就是能够区分所有打开的文件。


二.函数学习


man命令默认是按照Linux系统内置手册顺序查找你要搜索的关键词,一旦找到就不继续查找了。相应的顺序是1命令,2系统调用,3库函数。


2.1 打开文件

2.1.1 函数名

Open


2.1.2 函数原形

(1)int open(const char* pathname,int flags);

(2)int open(const char* pathname,int flags.mode_t mode);



2.1.3 函数功能

打开或者创建一个文件


2.1.4 所属头文件

<sys/types.h>

<sys/stat.h>

<fcntl.h>


2.1.5 返回值

成功 返回文件描述符

失败 返回-1


2.1.6 参数说明

Pathname:要打开的文件名(含路径)

Flags:文件打开以后的权限

(1)必须包含以下三者之一

O_RDONLY,O_WRONLY,O_RDWR

(2)可以外加包含以下选项

O_APPEND,O_CREAT

如果使用O_CREAT选项,则必须使用第三个参数mode。默认是不创建不存在的文件的。默认是覆盖之前存在的文件内容的,所以要指明是否以追加方式打开。

Mode:文件待创建文件的访问权限,前提是要在flags参数里面包含了o_creat标志。格式是:文件所有者 + 文件同组用户 + 其他用户。前面多一个0表示粘连位。


2.2 创建文件

2.2.1 函数名

Creat


2.2.2 函数原形

int creat(const char *pathname, mode_t mode);


2.2.3 函数功能

创建一个文件并且以只写的方式打开它。

如果已经存在则不创建。


2.2.4 所属头文件

<sys/types.h>

<sys/stat.h>

<fcntl.h>


2.2.5 返回值

成功 返回文件描述符

失败 返回-1

2.2.6 参数说明

Pathname:创建的文件名(含路径)

Mode:创建的文件爱你的读写权限

2.3 关闭文件

2.3.1 函数名
Close

2.3.2 函数原形
Int close(int fd);

2.3.3 函数功能
关闭一个打开的文件

2.3.4 所属头文件
<unistd.h>

2.3.5 返回值
成功:0
失败:-1

2.3.6 参数说明
Fd:要关闭的文件的文件描述符。


2.4 读文件

2.4.1 函数名
read

2.4.2 函数原形
 ssize_t read(int fd, void *buf, size_t count);

2.4.3 函数功能
从打开的文件中读取指定大小的数据到指定的内存位置。

2.4.4 所属头文件
<unistd.h

2.4.5 返回值
成功:返回读取的字节数
失败:返回-1

2.4.6 参数说明
Fd:已经打开且要从该文件读取数据的文件描述符
Buf:存放读取到的数据的起始位置
Count:想要读取的字节数


2.5 写文件

2.5.1 函数名
Write

2.5.2 函数原形
ssize_t write(int fd, const void *buf, size_t count);

2.5.3 函数功能
向已经打开的文件写入预先指定的数据

2.5.4 所属头文件
<unistd.h>
2.5.5 返回值
成功:返回成功写入的字节数
失败:-1

2.5.6 参数说明
Fd:已经打开且要向该文件写入数据的文件描述符
Buf:要写入的数据存放的起始位置
Count:想要写入的字节数
  

文件操作中有隐形的文件读写指针,打开文件的时候,默认是指向文件头,在写入数据到该打开的文件后,文件读写指针指向了文件尾,当文件还未关闭,就继续读取数据的话,只能读到空数据,因为读和写都是按照文件指针的位置进行的。


2.6 定位文件

2.6.1 函数名
Lseek

2.6.2 函数原形
 off_t lseek(int fd, off_t offset, int whence);

2.6.3 函数功能
将文件读写指针移动到指定位置

2.6.4 所属头文件
 <sys/types.h>
 <unistd.h>

2.6.5 返回值
成功:返回文件读写指针距离文件头的位置(字节数)
失败:-1

2.6.6 参数说明
fd:要移动指针的文件
Offset:移动的距离(字节数)
Whence:决定指针以什么位置为基准开始移动
SEEK_SET:以文件头为基准,此时的offset只能是整数
SEEK_CUR: 以当前位置为基准,此时的offset可正可负,正数往后移动,负数往前移动。
SEEK_END:以文件尾为基准移动,此时的offset之能是负数。

2.7 复制文件描述符

2.7.1 函数名
Dup

2.7.2 函数原形
int dup(int oldfd);

2.7.3 函数功能
复制一个已存在的文件描述符,但是和老描述符指向同一文件。

2.7.4 所属头文件
 <unistd.h>

2.7.5 返回值
成功:返回新的文件描述符
失败:-1
2.7.6 参数说明
Oldfd:要复制的老的文件描述符。

三.复制文件实例
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#define BUF_SIZE 1024#define SRC_FILE_NAME "src_file"#define DST_FILE_NAME "dst_file"#define OFFSET 10240int main(void){        int src_file,dst_file;        unsigned char buff[BUF_SIZE];        int real_read_len;        src_file = open(SRC_FILE_NAME,O_RDONLY);        dst_file = open(DST_FILE_NAME,O_WRONLY|O_CREAT,0644);        if(src_file < 0 | dst_file < 0)        {                printf("open error!\n");                exit(1);        }        lseek(src_file,-OFFSET,SEEK_END);        while((real_read_len = read(src_file,buff,sizeof(buff))) > 0)        {                write(dst_file,buff,real_read_len);        }        close(dst_file);        close(src_file);        return 0;}



0 0
原创粉丝点击