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;
}
相关推荐
苏瞳儿3 小时前
java对数据库的增删改查
java·数据库·oracle
zhangjw343 小时前
Java基础语法:变量、数据类型与运算符,从原理到实战
java·开发语言
yaoxin5211236 小时前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
NotFound4867 小时前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
Ava的硅谷新视界8 小时前
用了一天 Claude Opus 4.7,聊几点真实感受
开发语言·后端·编程
rabbit_pro8 小时前
Python调用onnx模型
开发语言·python
一 乐8 小时前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
浪客川8 小时前
【百例RUST - 010】字符串
开发语言·后端·rust
鱼鳞_9 小时前
Java学习笔记_Day29(异常)
java·笔记·学习
烟锁池塘柳09 小时前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象