《C语言》文件操作

文章目录

    • 一、认识文件
        • 1、文件的概念
        • 2、程序文件
        • 3、数据文件
        • 4、文件名
    • 三、二进制文件和文本文件
    • 四、文件的打开和关闭
        • 1、流
        • 2、标准流
        • 3、文件指针
        • 4、文件的关闭和打开
    • 四、文件的顺序读写
    • 文件的随机读写
        • 1、fseek
        • 2、ftell
        • 3、rewind
        • 4.int origin

一、认识文件

主要讨论数据文件

1、文件的概念

文件是保存在硬盘、U盘、软盘、光盘等外部存储设备上的数据信息叫做文件。
我们写的程序是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。

2、程序文件

程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

3、数据文件

文件的内存不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

4、文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:c:\code\test.txt
这种文件标识叫绝对路径
.\代表当前路径..\代表上一级路径
这种是相对路径的表示

三、二进制文件和文本文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
在内存中不加以转换的数据叫做二进制文件。
文本文件是在外存上以ASCII码的形式存储,则需要再存储前转换。以ASCII字符形式存储的文件就是文本文件。

四、文件的打开和关闭

1、流

程序中的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着的字符河。
C程序针对文件、画面、键盘等数据输出操作都是通过流操作的。
一般情况下,我们要想向流里面写数据,或者从流中读取数据,都是要打开流,然后操作。

2、标准流

那为什么我们从键盘中输入数据,向屏幕上输出数据,并没有打开流呢?
因为C语言在启动的时候,默认打开了3个流:

  • stdin - 标准输入流,大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
  • stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
  • stderr - 标准错误流,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr三个流的类型是:FILE*,通常称为文件指针。
C语言中,就是通过FILE*的文件指针来维护各种操作的。

3、文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE。
不同的C编译器的FILE类型包含的内容不完全相同,但大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
下面创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。

4、文件的关闭和打开

在文件读写之前应该先打开文件,在使用结束之后应该关闭文件
fopen函数用来打开文件,fclose来关闭文件。

//打开⽂件 
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件 
int fclose ( FILE * stream );

const char * filename:代表文件名
const char * mode: 代表文件打开模式

下面是文件打开模式:

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只读)为了输出数据,打开⼀个⽂本⽂件建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件出错
“w+”(读写)为了读和写,建议⼀个新的⽂件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

实例:

#include<stdio.h>
int main()
{//打开文件//打开方式为只写FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件//写入一个字符afputc('a', pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

四、文件的顺序读写

函数名功能适用于
fgfetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输出流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数所有输出流
fread⼆进制输⼊⽂件
fwrite⼆进制输出⽂件

文件的随机读写

1、fseek

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

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

FILE* stream代表一个流
long int offset 代表偏移量
int origin 相对位置

2、ftell

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );
3、rewind

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

void rewind ( FILE * stream );
4.int origin

在这里插入图片描述

SEEK_SET相对于起始位置
SEEK_CUR相对于指针位置
SEEK_END相对于文件末尾

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/28483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想三刷二叉树篇1

代码随想三刷二叉树篇1 144. 二叉树的前序遍历题目代码 145. 二叉树的后序遍历题目代码 94. 二叉树的中序遍历题目代码 102. 二叉树的层序遍历题目代码 107. 二叉树的层序遍历 II题目代码 199. 二叉树的右视图题目代码 637. 二叉树的层平均值题目代码 515. 在每个树行中找最大值…

Javaweb06-Jsp技术

Jsp技术 一.Jsp的运行原理 **概述&#xff1a;**JSP是Java服务器页面&#xff0c;既可以写静态页面代码&#xff0c;也可以写动态页面代码 **特点&#xff1a;**跨平台性&#xff0c;业务代码相分离&#xff0c;组件重用&#xff0c;预编译 运行原理&#xff1a; 客户端发生…

如何设计一个秒杀系统?

这篇分享源自之前购买的极客时间课程《如何设计一个秒杀系统》&#xff0c;以及书籍《亿级流量网站架构核心技术》。 这两个讲的都是关于高并发系统设计的&#xff0c;感觉收获颇多。 本篇内容对核心要点进行了摘录&#xff0c;也结合网上一些文章&#xff0c;希望能分享所得…

运算符及表达式+基本语句和函数使用的详细讲解

运算符及表达式 运算符及表达式 在C语言中&#xff0c;运算符是用于执行特定操作的符号&#xff0c;而表达式则是由运算符和操作数组成的式子。 1) 运算符 运算符的目数 单目运算符&#xff1a;只需要一个操作数&#xff0c;如 !&#xff08;逻辑非&#xff09;、&#xf…

简易开发一个app

即时设计网站 即时设计 - 可实时协作的专业 UI 设计工具 需要先设计好UI界面 上传到codefun 首次需要安装 自动生成代码 打开hb软件 新建项目 打开创建的项目 删除代码 复制代码过去 下载图片 将图片放到文件夹里 改为这种格式 index.vue 如果不需要uni-app导航栏可以修改 …

026、工具_redis-server

redis-server除了启动Redis外,还有一个 --test-memory选项。 redis-server- -test-memory可以用来检测当前操作系统能否稳定地分配指定容量的内存给 Redis,通过这种检测可以有效避免因为内存问题造成Redis崩溃,例如下面 操作检测当前操作系统能否提供1G的内存给Redis: red…

项目文件预览

在实际项目开发过程&#xff0c;项目使用数据存在多种形式&#xff0c;“文件”也是一种常见形式&#xff0c;因此&#xff0c;“文件预览”功能变成了常规需求。 kkFileView项目使用流行的spring boot搭建&#xff0c;易上手和部署。万能的文件预览开源项目&#xff0c;基本支…

【代码随想录算法训练Day39】LeetCode 62.不同路径、LeetCode 63.不同路径II

Day39 动态规划第二天 LeetCode 62.不同路径 二维dp数组的含义&#xff1a;走到位置为(i,j)的格子的走法为dp[i][j]种。 递推公式&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1]。 初始化&#xff1a;dp[i][0]和dp[0][j]都赋值为1. 递归顺序&#xff1a;从左往右&#xff0c;从上…

以太网基础知识(二)—NRZ,PAM4调制技术

1&#xff1a;码元 了解调制技术需要引出“码元”的概念。 一个码元就是一个脉冲信号&#xff0c;即一个最小信号周期内的信号&#xff0c;我们都能够理解&#xff0c;最简单的电路&#xff0c;以高电平代表1&#xff0c;低电平代表0&#xff0c;一个代表1或者0的信号&#x…

分层解耦

三层架构 controller:控制层&#xff0c;接收前端发送的请求&#xff0c;对请求进行处理&#xff0c;并响应数据&#xff0c; service:业务逻辑层&#xff0c;处理具体的业务逻辑。 dao:数据访问层(Data Access Object)(持久层)&#xff0c;负责数据访问操作&#xff0c;包括数…

No module named ‘torch.distributed.checkpoint.format_utils问题解决

完整代码&#xff1a; Traceback (most recent call last):File "/data/user/BMLU-use/src/English_chat/qwen1.5.py", line 97, in <module>main(model_pathargs.model_path,max_lengthargs.max_length,nameargs.name)File "/data/user/BMLU-use/src/En…

讨论C++模板

讨论C模板 函数重载和泛型编程模板分类函数模板语法原理函数模板的实例化隐式实例化显示实例化 匹配原则 类模板语法类模板的实例化 C支持了函数重载&#xff0c;通过函数名相同&#xff0c;参数列表不同来构成函数重载&#xff0c;以达到方便程序员调用。但还是没有改变代码大…

KT-H6测距模块标品,测距范围1500m,demo报价1000RMB,批量报价500RMB

激光测距传感器是一种用于测量距离的模块,通常由传感器和相关电子设备组成,测距模块可以集成到各种设备和系统中,以实现准确的测距和定位功能。KT-H6系列激光测距模块,为自主研发,激光波长905nm的激光器,专为热成像、夜视仪、无人机、安防、瞄具等产品定身打造,其优点是…

基于Matlab停车场车牌识别计时计费管理系统 【W2】

简介 停车场车牌识别计时计费管理系统在现代城市管理中具有重要意义。随着城市化进程的加快和车辆数量的增加&#xff0c;传统的人工管理停车场的方式已经难以满足效率和精确度的要求。因此引入车牌识别技术的自动化管理系统成为一种趋势和解决方案。 背景意义 提升管理效率&a…

赶紧收藏!2024 年最常见 20道并发编程面试题(九)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道并发编程面试题&#xff08;八&#xff09;-CSDN博客 十七、什么是乐观锁和悲观锁&#xff1f; 乐观锁和悲观锁是两种不同的并发控制策略&#xff0c;用于管理多线程环境下对共享资源的访问&#xff0c;以确保数…

中高级软件工程师的c语言面试题

文章目录 问题1&#xff1a;解释 volatile 关键字的作用及其应用场景。问题2&#xff1a;解释C语言中的内存对齐&#xff08;Memory Alignment&#xff09;以及为什么需要对齐。问题3&#xff1a;解释C语言中的“严格别名规则”&#xff08;Strict Aliasing Rule&#xff09;&a…

元数据、数据元、数据字典、数据模型及元模型的区别详解

在数据管理和分析领域&#xff0c;有许多相似的概念&#xff0c;如元数据、数据元、数据字典、数据模型和元模型。这些概念的定义和应用往往容易混淆。 数据元 数据元是通过一系列属性描述的数据单元&#xff0c;包括定义、标识、表示以及允许值等。这些属性帮助我们理解和使用…

【Java04】引用变量数组初始化的内存机制

引用类型数组指向的元素也是引用。其本质是&#xff1a; 由一个在栈上的引用数组变量指向一块堆内存&#xff1b;这块堆内存里存储的元素是引用&#xff0c;又分别指向其他堆内存。 class Person // Person是一个自定义的类 {public int age;puiblic double height;public vo…

Codeforces Round 953 (Div. 2)(A~D题解)

这次比赛是我最顺利的一次比赛&#xff0c;也是成功在中途打进前1500&#xff0c;写完第三道题的时候也是保持在1600左右&#xff0c;但是后面就啥都不会了&#xff0c;还吃了点罚时&#xff0c;虽说如此也算是看到进步了&#xff0c;D题学长说很简单&#xff0c;但是我当时分析…

什么是 古典概型

古典概型是概率论中的一种基本概型&#xff0c;其定义如下&#xff1a; 古典概型&#xff08;Classical Probability Model&#xff09;&#xff1a; 在一个有限的样本空间中&#xff0c;如果每个基本事件&#xff08;即样本空间中的每一个可能结果&#xff09;出现的可能性都…