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

文件(打开关闭读写) C语言

一、文件


二、打开文件 关闭文件

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

功能: 打开文件,获得对应的流指针数:

"r"            只读方式,文件必须存在,不存在则报错

"r+"       读写方式,文件必须存在,不存在则报错的空文件的空文件

"w"            只写方式,文件存在时,截短为 0  ,不存在,则创建 -->创建了一个新文件

"w+"          读写方式,文件存在时,截短为 0  ,不存在,则创建 -->创建了一个新文件

"a"            追加(写),文件存在时,从文件末尾开始写,文件不存在时,则新建一个文件

"a+"          追加(读写),文件存在时,从文件末尾开始写,文件不存在时,则新建一个文件

对二进制文件:

"rb"       "rb+"     "wb"       "wb+"     "ab"       "ab+"

返回值:

        成功   FILE 指针

        失败   NULL


fclose(FILE *)

p.s.

当开始运行一个 C 程序时,系统将会负责自动打开三个文件: 标准输入   标准输出  标准出错

与之对应的指针分别为:stdin     stdout    stderr

这三个指针都是常量通常情况下:

标准输入---一般与键盘连接

标准输出  标准出错-- 与终端屏幕连接

打开关闭文件:


三、读、写(文件的定位)

1、按字符读写

读:(从文件中读取一个字符)

int fgetc(FILE *stream);

功能: 从指定的流文件中获得字符参数:

        @stream 指定的文件指针

返回值:

        成功 返回 对应字符的 ascii值

        失败 EOF (文件结束)error(错误)    都是-1

区分: eof 还是error

        //检查对应文件的状态(eof error)

        int feof(FILE *stream);//如果对应的文件数据到达文件结尾(eof),则该函数的返回值为非 0 值

        int ferror(FILE *stream); //如果对应的文件数据出错,则该函数的返回值为非 0 值


读取单个字符:

循环读取单个字符到文件结尾:

另一种写法:


2、写:(往指定文件中写入一个字符)

int fputc(@c,FILE *stream);

功能:

        实现字符输出参数:

        @c     要输入的字符

        @stream 指定的输入文件对应的文件指针

返回值:

成功 写入的字符对应的 ascii 码

失败 EOF

写入单个字符:


3、按行读写,按字符串进行读写

读:(从文件中读取一行字符串)

char *fgets(char *s, int size, FILE *stream);

功能: 获取字符(串) 参数:

        @s         自己开辟的一块内存空间的首地址(用来保存获取到数据)

        @size 一次 fgets 操作期望读取到的最大字符个数

        @stream 指定的输入文件的文件指针返回

返回值:

        成功 s

        失败 NULL

        文件结尾 NULL

读取结束:

(1) EOF

(2) '\n'

(3) size

'\n' 的处理:fgets 会将 '\n' 保存到 buffer 中去

        buffer:缓冲器

每次读取结束 最后都会添加一个 '\0' ,保证是一个字符串

fgets 一次最多能读取 size - 1 个字符

读取一行字符串:

写:

int fputs(const char *s, FILE *stream); // 将 s 指定的字符串输出到 stream 指定的文

件中

fputs 不会将'\0'进行输出,遇到'\0'就输出

4、按对象读写(二进制的读写)

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

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

对象: --> 可以指定按什么数据类型进行操作(int char short 结构体等)

参数:

        @ptr                       保存数据的

        @size                     单个对象的大小              sizeof(对象类型)

        @nmemb                   一次期望操作的对象个数

        @stream                要操作的流文件

返回值:

        成功 返回值 成功操作的 对象个数

        失败 0

注意:

        一次操作的字节数  =  成功操作的对象个数 * 单个对象的大小

        如果想完整的读取到文件的内容,文件中没有固定的数据格式时, 最好按 char 来读。

读写一组数据:


四、文件定位:

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

功能: 设置 offset 的值,实现定位

参数:

        @stream 要定位的文件指针

        @offset 偏移值

        @whence 相对的偏移起点

        SEEK_SET                        从文件开头偏移(0)    offset >= 0

        SEEK_CUR                       当前位置(1)      offset 可正可负

        SEEK_END                       文件结尾(2)      offset  可正可负

返回值:

成功 0

失败 -1 &error 置位

eg:

//从文件开头偏移 100 个字节

fseek(fp,100,SEEK_SET);

//从当前位置 往后偏移 100 字节

fseek(fp,100,SEEK_CUR);

//从当前位置 往前偏移 100 字节

fseek(fp,-100,SEEK_CUR);

//从文件尾部位置 往后偏移100 字节------- >相当于在源文件的基础上又扩充了100 个字节

fseek(fp,100,SEEK_END);

重定位:大小可以通过计算获得


http://www.kler.cn/news/316937.html

相关文章:

  • 面向对象程序设计——mapの简析
  • kettle从入门到精通 第八十七课 ETL之kettle kettle文件上传
  • DevExpress中文教程:如何将WinForms数据网格连接到ASP. NET Core WebAPI服务?
  • 笔记9.18
  • C++速通LeetCode中等第1题-字母异位词分组
  • 在vue中:style 的几种使用方式
  • 【Elasticsearch系列五】Java API
  • Day30_0.1基础学习MATLAB学习小技巧总结(30)——优化工具箱及
  • prime1靶机渗透 (信息收集 内核提权)
  • H5白色大方图形ui设计公司网站HTML模板源码
  • DSP学习00-F28379D学习准备(了解一个工程的构成)
  • python mysql pymysql 数据库操作,常用脚本,个人小工具
  • 通过 LabVIEW 正则表达式读取数值(整数或小数)
  • Java基础尚硅谷85-面向对象特征一:封装性
  • Java中的事件(动作监听-ActionListener)
  • 如何使用ssm实现企业文档管理系统+vue
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Perf调测】
  • Tcping:一款实用的端口存活检测工具
  • spring自定义属性编辑器
  • 本地生活商城开发搭建 同城O2O线上线下推广
  • 为什么 Feign 要用 HTTP 而不是 RPC?
  • Dify创建自定义工具,调用ASP.NET Core WebAPI时的注意事项(出现错误:Reached maximum retries (3) for URL ...)
  • Java_Day03学习
  • 前端vue左侧树的一整套功能实现(一):vue2+vite封装v-resize指令,实现左侧树拖拽宽度和折叠展开
  • Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
  • 江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)
  • web基础—dvwa靶场(十一)CSP Bypass
  • Linux相关概念和重要知识点(6)(make、makefile、gdb)
  • SQLServer数据分页
  • Python 中的函数装饰器:理解 @property、Getter 和 Setter 方法