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;
}
相关推荐
用户3126874877203 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang3 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing3 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活4 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
lhldsg5 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售
Interview Aid1126 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
mldong6 小时前
换了工作流引擎,前端一行代码没改
java·架构
CoderIsArt13 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
微尘寒风13 小时前
【Git】的安装和使用
java·git
y = xⁿ14 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习