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;
}
相关推荐
糯米团子7491 分钟前
javascript高频知识点
开发语言·前端·javascript
January12072 分钟前
IDEA 快捷键
java·ide·intellij-idea
周杰伦fans6 分钟前
C# 异常继承深度解析:从设计原则到 sealed 关键字的奥秘
java·jvm·c#
搬石头的马农7 分钟前
从零配置Claude自动修Bug:6步打造全自动开发流程
java·人工智能·python·bug·ai编程
小马爱打代码14 分钟前
Redis Key 过期后会立刻删除吗?过期删除与内存淘汰策略详解
java·redis·缓存
Wonderful U16 分钟前
基于Python+Django的在线题库与智能阅卷系统:从痛点分析到完整实现
开发语言·python·django
码语智行16 分钟前
拦截器、接口限流、过滤器、防重发/幂等性功能说明
开发语言·网络·python
liulilittle19 分钟前
麻将牌堆渲染(Lua)
开发语言·lua
鱼鳞_21 分钟前
苍穹外卖-Day10(Spring task)
java·后端·spring
雨落在了我的手上30 分钟前
初始java(十七):常⽤⼯具类介绍
java·开发语言