IO编程:2.文件IO

1.文件IO与标准IO区别:

  • 标准IO有缓存,是库函数,适用于处理普通文件
  • 文件IO无缓存,是系统调用,适用于处理设备文件、通信文件

2.系统调用

  • Linux内核中的函数接口

3.库函数

  • 对系统调用的封装

4.系统默认打开3个文件描述符

  • 0:标准输入->stdin
  • 1:标准输出->stdout
  • 2:标准错误->stderr

5.文件描述符的特性

  • 文件描述符有上限限制
  • 新产生的文件描述符总是选择最小且尚未被使用的非负整数

6.文件IO接口

1).open

原型:int open(const char *pathname, int flags);

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

功能:打开文件获得操作文件的文件描述符

参数:

pathname:

flags:

O_RDONLY 只读

O_WRONLY 只写

O_RDWR 读写

O_CREAT 文件不存在则创建 权限:一般0664(rw-rw-r--)

O_TRUNC 文件存在则截断清0

O_EXCL 文件则存在报错

O_APPEND 追加

O_ASYNC 异步IO

返回值:

成功返回新的文件描述符

失败返回-1

r -> O_RDONLY

r+ -> O_RDWR

w -> O_WRONLY | O_CREAT | O_TRUNC, 0664

w+ -> O_RDWR | O_CREAT | O_TRUNC, 0664

a -> O_WRONLY | O_CREAT | O_APPEND, 0664

a+ -> O_RDWR | O_CREAT | O_APPEND, 0664

cs 复制代码
fd = open("file.txt",O_RDONLY);
fd = open("file.txt",O_RDWR);
fd = open("file.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);
fd = open("file.txt",O_RDWR | O_CREAT | O_TRUNC,0664);
fd = open("file.txt",O_RDONLY | O_CREAT | O_APPEND,0664);
fd = open("file.txt",O_RDWR | O_CREAT | O_APPEND,0664);

2).close

原型:int close(int fb)

功能:关闭文件描述符

3).write

原型:ssize_t write(int fd, const void *buf, size_t count);

功能:向fd中写入从buf开始的count个字节

参数:

fb:文件描述符

buf:写入数据空间的首地址

count:写入数据的字节数

返回值:

成功返回实际写入的字节数

失败返回-1

4).read

原型:ssize_t read(int fd, void *buf, size_t count);

功能:从fd中读取count个字节放入buf开始的空间

参数:

fb:文件描述符

buf:存放数据空间的首地址

count:最多读取的字节数

返回值:

成功返回实际读取字节个数

读到文件末尾返回0

读取出错返回-1

5).lseek

原型:off_t lseek(int fd, off_t offset, int whence);

功能:重定位文件描述的偏移量

参数:

fd:文件描述符

offset:偏移量

whence:

SEEK_SET 文件开头

SEEK_CUR 文件当前位置

SEEK_END 文件末尾

返回值:

成功返回偏移量

失败返回-1

7.ex

下为图片文件的拷贝

cs 复制代码
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>

int main(void)
{
    int afd = 0;
    int bfd = 0;
    ssize_t a = 0;
    char tmpbuff[1024] = {0};
    afd = open("yinga.jpg",O_RDONLY);
    if(-1 == afd)
    {
        perror("fail to open");
        return EOF;
    }
    bfd = open("yingb.jpg",O_WRONLY | O_CREAT | O_TRUNC,0664);
    if(-1 == bfd)
    {
        perror("fail to open");
        return EOF;
    }
    while(1)
    {
        a = read(afd,tmpbuff,sizeof(tmpbuff));
        write(bfd,tmpbuff,a);
        if(a == 0)
            break;
    }
    close(afd);
    close(bfd);
    return 0;
}
相关推荐
majingming1235 小时前
FUNCTION
java·前端·javascript
zopple5 小时前
常见的 Spring 项目目录结构
java·后端·spring
是娇娇公主~5 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene6 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
xuxie997 小时前
N11 ARM-irq
java·开发语言
cjy0001117 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20177 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01227 小时前
Spring Boot实现定时任务
java
小江的记录本8 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34168 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端