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

【C语言复习】C语言中的文件操作

C语言中的文件操作

  • 写在前面
  • 文件操作
    • 什么是文件
      • 文件的分类
      • 文件名
    • 文件的操作
      • 文件指针
      • 文件的打开和关闭
      • 文件的顺序读写
      • 文件的随机读写
        • fseek
        • ftell
        • rewind
        • feof

写在前面

文件操作在C语言部分只是属于了解内容,但是因为它可能会应用在项目中,所以我把它单独写成一个小节。

文件操作

什么是文件

文件的分类

文件一般分为程序文件和数据文件。

  • 程序文件是包括源程序文件(后缀名.c),目标文件(windows环境下后缀名为.obj),可执行程序(windows环境下后缀名为.exe)
  • 数据文件是程序运行过程中需要从中读取数据的文件,或者程序运行中输出内容的文件

本小节文件操作,指的就是数据文件的操作。

根据数据在文件中的组织形式,数据文件又分为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出,就是二进制文件。如果要求在外存上以ASCII码的形式存储,就需要在存储前进行转换。以ASCII字符的形式存储的文件就是文本文件。

一个数据在内存中是怎么存储的呢? 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

文件名

文件名是唯一的文件标识,包含三部分:文件路径,文件名主干,文件名后缀。

文件的操作

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,

使用者不必关心细节。 一般都是通过一个FILE的指针来维护这个FILE结构的变量,使用起来更方便。

//创建FILE*指针变量
FILE* pf;

通过文件指针就可以找到与他相关联的文件。

文件的打开和关闭

文件在读写之前应该先打开,从而打开文件流,建立一个FILE类型的结构体,读写后应该关闭它。

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不关闭,就不会刷新C语言内部的缓冲区,从而导致读写出现问题。

//打开
FILE* fopen(const char* filename, const char* mode);
//关闭
int fclose(FILE* stream);
文件打开mode意义如果指定文件不存在
“r” (只读)为了输入数据,打开一个已经存在的文本文件(输入指的是 文件 -> 内存)出错
“w” (只写)为了输出数据,打开一个文本文件(输出指的是 文件 <- 内存)建立新文件
“a” (追加)文件尾部添加数据建立新文件
“rb” (只读)二进制的r出错
“wb” (只写)二进制的w建立新文件
“ab” (追加)二进制的a出错
“r+” (读写)为了读和写,打开一个文本文件出错
“w+” (读写)为了读和写,建立一个新文件新建
“a+” (读写)打开一个文件,在文件尾部进行读写新建
“rb+”(读写)为了读和写,打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立
“ab+”(读写)打开一个二进制文件,在文件尾部进行读写建立新文件

文件的顺序读写

功能函数名使用条件
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入函数fread文件
二进制输出函数fwrite文件

文件的随机读写

fseek

根据文件指针的位置和偏移量来定位文件指针。

可以修改文件指针的位置到任意位置,根据origin来选定文件起始或者是当前位置,根据偏移量修正位置,到任意位置处。

int fseek ( FILE * stream, long int offset, int origin );
ConstantReference position
SEEK_SETBeginning of file
SEEK_CURCurrent position of the file pointer
SEEK_ENDEnd of file *

ftell

前面fseek 是将文件指针移动至任意位置,ftell可以返回文件指针相对于起始位置的偏移量。

long int ftell ( FILE * stream );

rewind

让文件指针的位置回到文件的起始位置。

void rewind ( FILE * stream );

feof

注意,在文件读取过程中,不能用feof 函数的返回值来判断文件是否结束。feof 使用场景是,当文件读取结束的时候,feof 判断是读取失败结束的,还是遇到文件尾部结束的。

所以正确的读取判断文件结束的方法:

  • 文本文件读取是否结束,判断返回值是否为 EOF (对fgetc),或者 NULL (对fgets)
  • 二进制文件的读取结束判断返回值是否小于实际要读取的个数。(fread)

文件操作小节完。主要掌握的还是如何使用文件操作函数。

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

相关文章:

  • 00后整顿职场,当摸鱼测试员遇上了内卷00后。
  • 程序员的上帝视角(4)——视角
  • 一、webpack基础
  • 超详细VMware CentOS7(最小安装)安装教程
  • 经典卷积模型回顾8—NIN实现图像分类(matlab)
  • 【Java笔记】泛型
  • 【Linux】用户管理
  • 深入理解Mysql索引底层数据结构与算法
  • 【SpringBoot高级篇】SpringBoot集成jasypt 配置脱敏和数据脱敏
  • JAVA知识体系(二)
  • Verilog 学习第八节(数码管段码显示)
  • 方案开发|快递吊钩电子秤方案
  • Spring-IOC容器初始化过程
  • AspCms标签手册
  • 什么是Netty
  • SpringCloud:统一网关Gateway
  • 【独家】华为OD机试 - 最差产品奖(C 语言解题)
  • ​力扣解法汇总1599. 经营摩天轮的最大利润
  • MySQL-常见的五种索引
  • Linux学习第二十三节-压缩和解压缩和tar打包工具
  • 没有钱怎么创业?一分钱没有如何能创业成功?
  • 【操作系统原理实验】银行家算法模拟实现
  • java医院云HIS系统:融合B/S版电子病历系统 能与公卫、PACS等各类外部系统融合
  • 单线激光雷达(SICK)驱动安装及时空标定
  • Java IO流
  • LeetCode - 1653 使字符串平衡的最少删除次数
  • 【微信小程序】-- 页面事件 - 上拉触底 - 案例(二十七)
  • 《超导电子技术及其应用》学习日志(二)
  • 微信小程序this指向问题
  • 【报错】paddle相关报错和处理方法