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;
}
相关推荐
寻寻觅觅☆9 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t10 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
青云计划10 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar12311 小时前
C++使用format
开发语言·c++·算法
探路者继续奋斗11 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
码说AI11 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS11 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子12 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言
老约家的可汗12 小时前
初识C++
开发语言·c++