当前位置: 首页 > news >正文

Linux:IO库函数

目录

    • 标准库IO函数
    • 一、fopen
    • 二、fwrite
    • 三、fread
    • 四、fseek
    • 五、fclose

  在编写程序时,离不开IO操作,最常见的IO操作就是用printf函数进行打印,本文主要介绍的是封装后的IO库函数。

标准库IO函数

常使用的IO库函数如下:

函数作用
fopen打开指定的文件
fwrite向指定的文件写入数据
fread从指定的文件读取数据
fseek跳转到指定文件的读写位置
fclose关闭指定文件

一、fopen

FILE *fopen(const char *path, const char *mode);

 作用:用指定的方式打开指定的文件

  • const char *path:文件名(要带这个文件的路径)
  • const char *mode:文件的打开方式(只读、追加写等方式)

 返回值:成功返回FILE*文件流指针,通过这个指针来操作文件,失败返回NULL。

文件打开方式 mode:

  • r只读,文件必须存在,否则打开失败
  • r+可读可写,文件必须存在,否则打开失败
  • w只写,文件不存在会创建文件并打开,文件存在则会清空文件的原有内容并打开文件
  • w+可读可写,文件不存在会创建文件并打开,文件存在则会清空文件的原有内容并打开文件
  • a追加只写,文件不存在会创建文件并打开,文件存在则直接打开,写入数据时把数据写入到文件末尾
  • a+可读追加写,文件不存在会创建文件并打开,文件存在则直接打开,写入数据时把数据写入到文件末尾
  • b以二进制方式打开文件,否则默认以文本形式打开文件

 以上这些方式都是可以组合的,比如可以使用二进制打开并且可读追加写:ba+

二、fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

 作用:通过传递的文件流指针,向文件写入指定大小的数据。

  • const void *ptr:要向文件写入的数据的首地址
  • size_t size:要向文件写入数据的块大小。因为文件的写入和读取是以块为单位的,块大小就是把数据均分成几块,每块文件有多大。
  • size_t nmemb:要向文件写入数据的块的个数。
  • FILE *stream:文件流指针,表示要把数据写入到哪个文件

  返回值:返回实际写入文件的完整块的个数(1.5个块就返回1,0.5就返回0),出错返回0。

三、fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

 作用:从指定的文件读取指定大小的数据。

  • void *ptr:用来存储读取到的数据的空间的首地址。
  • size_t size:要读取的块的大小。
  • size_t nmemb:要读取的块的个数。
  • FILE *stream:要操作的文件的文件流指针。

 返回值:成功返回实际读取到的完整块的个数,读取不足一块的返回0,读取到了文件末尾返回0,出错了返回0。因此返回值是有歧义的。

 因为返回值有歧义,因此通常把nmenb设置为要读取的数据的长度,把块的大小设置成1,这种方式可以明确通过返回值判断,到底有没有读取到数据。还可以使用下面两个函数来帮助判断返回值的含义。

  •  int ferror(FILE* stream):

    •  作用:测试文件的上一次操作是否出错了,出错了返回1
  •  int feof(FILE*stream):

    •  作用:测试文件读写是否到达文件末尾,到达文件末尾返回1

四、fseek

int fseek(FILE *stream, long offset, int whence);

 作用:跳转文件的读写位置。

  • FILE *stream:要操作的文件流指针
  • long offset:偏移量(负数表示向前偏移,整数表示向后偏移,0不偏移)
  • int whence:表示从哪里开始偏移

 返回值:成功返回0,失败返回-1

什么是读写位置,为什么要跳转?

 如果往一个文件写数据,写完之后直接读取,你会发现什么也读不出来。因为文件有一个读写位置,你可以理解成一个指针,这个指针指向的是你文件操作的最末端,你从最末端读取自然读取不出来,因此读取前要把指针指向文件的开头,也就是把读写位置跳转到开头。

读写位置

whence选项:

  • SEEK_SET:起始位置
  • SEEK_CUR:当前读写位置
  • SEEK_END:末尾位置

注意:如果你想在追加写的时候跳转读写位置,比如说,想在文件的开头进行追加写,这样是不会成功的,因为追加写只会在文件末尾进行写入

 文件的写入是一种覆盖式写入,比如我将读写位置跳转到w字符处,然后写入123,这样wor三个字符会被覆盖。

覆盖写入

五、fclose

int fclose(FILE *stream);

 作用:关闭文件

  • FILE *stream:要关闭的文件的文件流指针

 返回值:成功返回0,失败返回-1

http://www.lryc.cn/news/35727.html

相关文章:

  • Go爬虫学习笔记
  • 数据结构课程设计:高铁信息管理系统(C++实现)
  • Python 模块之 datetime
  • linux安装编译ffmpeg
  • 嵌入式Linux驱动开发(二)LED驱动
  • C++学习
  • JavaEE简单示例——依赖注入
  • 大数据框架之Hive: 第7章 综合案例练习(初级)
  • kafka:linux 安装 kafka集群
  • springboot实现Hessian协议的RPC服务
  • 2-6 SpringCloud快速开发入门: Eureka 服务注册中心发现与消费服务
  • Java-Web之s2-001与CommonsCollections
  • 【JavaSE】数组的定义和使用(下)
  • Oracle 实现对全局错误语句的审计监控 ORA- alert
  • React解决样式冲突问题的方法
  • Go项目(用户操作微服务)
  • Spring Boot统一功能处理
  • ETCD多次出现CONTEXT DEADLINE EXCEEDED
  • git 提交 多人开发避免冲突
  • 求职复盘:干了四年外包出来,面试5次全挂
  • AXI总线核心解读---基于官方文档
  • 【Linux修炼】15.进程间通信
  • 每天一道大厂SQL题【Day15】微众银行真题实战(五)
  • 如何优化查询大数据量的表
  • 卷麻了,00后Jmeter用的比我还熟练,简直没脸见人......
  • 力扣-树节点
  • MySQL8启动错误“Neither found #innodb_redo subdirectory, nor ib_logfile* files”
  • JVM系列——详细说明Volatile,原子性/可见性,先行发生原则
  • ArcGIS:栅格计算器的运算符和函数详解
  • spring的beanfactory与applicationContext的区别以及继承关系