【c语言】文件操作,解开你的疑惑

文件操作

  • 为什么使用文件
  • 什么是文件
    • 文件的分类
    • 文件名
  • 二进制文件和文本文件
  • 文件的打开与关闭
    • 流与标准流
      • 标准流
    • 文件指针
    • 文件的打开与关闭
  • 文件的顺序读写
  • 文件的随机读写
  • 文件读取结束的判定
  • 文件缓冲区

为什么使用文件

我们程序运行的数据是运行在内存中的,当成程序结束的时候,内存被回收,数据也就销毁了,等再次运行程序的时候,是看不到上次的数据的,所以我们要使用文件将数据保存。

什么是文件

保存在硬盘(磁盘)上的文件就是文件

文件的分类

我们一般把文件分为:

  1. 数据文件
  2. 程序文件

程序文件:源程序文件(后缀为.c),目标文件(windows环境下后缀为.obj),可执行程序(windows环境下后缀为.exe)
数据文件:文件内容不一定是程序,而是程序运行时读取的数据。

在这,我们只讨论数据文件

文件名

文件都有一个唯一的文件标识,以便用户识别和引用。为了方便称呼文件标识又成为文件名
文件名分为以下3个部分:
文件路径,文件名主干,文件后缀
如:c:\csdn\text.txt

  • c:\csdn\是文件路径
  • text是文件名主干
  • .txt是文件后缀

二进制文件和文本文件

根据数据的组织形式,将文件分为二进制文件文本文件
二进制文件:数据在内存中是以二进制的补码的形式存储的,如果我们不加转换的将数据存储到文件中,那这个文件就是二进制文件
文本文件:如果我们将数据转换成ascll码的形式存储到文件中,那这个以ascll码字符形式存储的文件就是文本文件。

一个数在文件中是怎么存储的?

  • 字符一律按照ascll码形式存储
  • 数值型数据可以按照ascll码的形式存储也可以按照二进制的形式存储

举个例子:整数10000,它的二进制是:00000000000000000010011100010000,那么将他以二进制的形式存储时,就如下图,占4字节。
在这里插入图片描述

将10000以ascll码的形式存储:
1的ascll码为:49,转换成二进制就是:00110001
0的ascll码为:48,转换成二进制就是:00110000
共占5个字节
在这里插入图片描述

在这里插入图片描述
测试代码:

int main()
{int a = 10000;FILE* pf = fopen("text.txt","wb");//以二进制的形式写入数据assert(pf);//判断是否打开成功fputc(a,pf);fclose(pf);//打开文件后要记得关闭文件pf = NULL;return 0;
}

我们看到文件里面的数据是一个看不懂的符号
在这里插入图片描述
当我们在vs下用二进制编辑器打开这个文本的时候会看到:00000000 10 27 00 00
前面的00000000我们不看,就来看10 27 00 00
将它转换成二进制会得到:0000 0000 0000 0000 0010 0111 0001 0000 对应:0 0 0 0 2 7 1 0,因为在vs下是小端存储,所以我们看到的是10 27 00 00

文件的打开与关闭

流与标准流

我们的程序要输出到各种外部设备,也要从各种外部设备中获取数据,但是不同的设备输入输出的操作各不相同,所以为了方便程序员对各种设备的操作,我们抽象出了流的概念。可以把流理解为:流淌着字符的河流

一般情况下,我们想要向流里写数据或者读取数据都是要打开流后再进行操作。

标准流

我们从键盘输入数据再输出到屏幕上就是打开了标准流。
你可能疑惑:我咋不记得我打开了标准流啊?
那是因为标准流都是默认打开的,在c语言执行的时候默认打开了三个流:

  • stdin,标准输入流
  • stdout,标准输出流
  • stderr,标准错误流

这三个流是默认打开的,所以我们使用printf、scanf函数时能输入输出数据。
stdin、stdout、stderr三个流的类型为:FILE*,文件指针

文件指针

缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。
每当打开一个文件的时都会在内存中开辟一个文件信息区,用来存放文件的相关信息的(文件名,文件状态,文件的当前位置)
这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE

VS2013编译环境提供的stdio.h 头⽂件中有以下的⽂件类型申明:

struct _iobuf {char *_ptr;int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异

我们可以创建一个文件指针:

FILE*pf;

这里定义了一个指向文件信息区的文件指针变量pf,通过这个指针变量可以间接的访问相关文件。
在这里插入图片描述

文件的打开与关闭

在使用的文件时,需要先打开文件,最后再关闭文件。
再编写程序时,打开文件会返回一个FILE*类型文件指针,该指针指向该文件
ANSI C规定,使用fopen函数来打开文件,fclose函数来关闭文件

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );//filename为文件指针,mode为文件的打开方式//关闭⽂件 
int fclose ( FILE * stream );
#include<stdio.h>
int main()
{FILE*pf=fopen("text.txt","r");//....程序fclose(pf);return 0;
}

文件的打开方式有下面这些:
在这里插入图片描述

文件的顺序读写

顺序读写函数介绍
在这里插入图片描述
上面所讲“适用于所有流指标准流和其他流(如文件流)”。
fgetc函数

int fgetc ( FILE * stream );

字符输入,对于键盘到程序来说,是从键盘输入到程序,对于文件到程序来说,是从程序输入到文件(也可称为读文件)

#include<stdio.h>
int main()
{FILE*pf=fopen("text.txt","r");//以读的形式打开文件,如果文件存在,则打开成功,否在打开失败if(pf=NULL)//判断文件是否打开成功{perror("fopen");//打印错误信息return 1;//打开失败就提前结束程序}int ch=0;ch=fgetc(pf);//fgetc函数的返回类型为int型printf("%c",ch);//输出到屏幕fclose(pf);pf=NULL;return 0;
}

假设这个文件中存放了一个字符a,那么这个字符a将被读取然后赋值到ch中在输出到屏幕上。

fputc函数

int fputc ( int character, FILE * stream );

输出字符,从程序输出到文件中。

int main()
{FILE*pf=fopen("text.txt","w");//以写的形式打开文件,如果文件存在,则删除原来的内容后写入数据,如果不存在,则创建新文件if(pf=NULL){perror("fopen");return 1;}fputc(c,pf);//向文件写入一个字符cfclose(pf);return 0;
}

对于顺序读写,是根据光标来的
在这里插入图片描述
当写入\读取一个数据后,光标会后移一位,对于读取文件,当读取到文件末尾时,会返回EOF,这表示文件读取结束。
我们可以通过EOF来循环读取文件:

#include<stdio.h>
int main()
{FILE*pf=fopen("text.txt","r");//以读的形式打开文件,如果文件存在,则打开成功,否在打开失败if(pf=NULL)//判断文件是否打开成功{perror("fopen");//打印错误信息return 1;//打开失败就提前结束程序}int ch=0;while((ch=fgetc(pf))!=EOF)//fgetc函数的返回类型为int型{printf("%c",ch);//输出到屏幕}fclose(pf);pf=NULL;return 0;

剩下的函数读者可自行去了解,用法于上面两个函数相差不大,这边我推荐一个网站来了解学习c语言相关函数
cplusplus

文件的随机读写

函数声明
fseekint fseek ( FILE * stream, long int offset, int origin );
ftelllong int ftell ( FILE * stream );
导管void rewind ( FILE * stream );

fseek函数
根据文件指针的位置和偏移量来定位文件指针

int fseek ( FILE * stream, long int offset, int origin );
offset为便宜量
origin为文件指针位置- SEEK_SET,文件起始位置- SEEK_CUR,文件当前位置- SEEK_END,文件末尾
int main()
{FILE* tmp = fopen("text.txt","r");int ch = fgetc(tmp);printf("%c\n",ch);fseek(tmp,2,SEEK_CUR);ch = fgetc(tmp);printf("%c\n",ch);fseek(tmp,-3,SEEK_END);ch = fgetc(tmp);printf("%c",ch);return 0;
}

假设文件中的内容有:abcdefg,那么读到的内容为“a” “d"以及"b”。

ftell函数
返回⽂件指针相对于起始位置的偏移量

 long int ftell ( FILE * stream );
int main()
{FILE* tmp = fopen("text.txt","r");int ch = fgetc(tmp);printf("%c\n",ch);fseek(tmp,2,SEEK_CUR);ch = fgetc(tmp);printf("%c\n",ch);fseek(tmp,-3,SEEK_END);ch = fgetc(tmp);printf("%c\n",ch);printf("%ld",ftell(tmp));//输出4return 0;
}

rewind函数
让文件指针回到文件的起始位置

 void rewind ( FILE * stream );

文件读取结束的判定

feof函数
用来判断文件结束的原因是不是因为读取到文件末尾
记住,feof函数不是用来判断文件是否读取结束的

文件缓冲区

ANSIC标准采用“缓冲文件系统”处理数据文件。简单来讲就是:打开文件时内存会开辟一块相应的文件缓冲区,当读取或写入数据时会先将数据放到缓冲区,等缓冲区空间满后在刷新缓冲区将数据读取到程序或者写入到文件中。缓冲区的大小由编译器决定。
在这里插入图片描述
因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件,如果不做,可能导致读写文件失败的问题。(关闭文件时会刷新缓冲区)
在这里插入图片描述

干兴趣的可以通过这段代码观察一下文件 的读写

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

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

相关文章

实用Python:文件与目录管理的17个技巧

今天我们要一起探索的是Python编程中的一个非常实用且基础的领域——文件与目录管理。无论是处理个人数据、自动化办公任务还是构建复杂的软件系统&#xff0c;这些技巧都将大大提升你的工作效率。准备好了吗&#xff1f;让我们一起动手吧&#xff01; 1. 打开与读取文件 目标…

三生随记——梦魇之枕

第一章&#xff1a;搬入新家 在迷雾笼罩的小镇边缘&#xff0c;伫立着一座年代久远的木屋。李晴站在屋外&#xff0c;打量着这座看似平静却充满神秘感的居所。因为工作的原因&#xff0c;她不得不暂时搬离喧嚣的城市&#xff0c;来到这个陌生的地方。 木屋内部陈旧却别有一番风…

品牌渠道健康发展的关键与方法

一个品牌的渠道健康与否对其长期发展至关重要。品牌虽多&#xff0c;但并非所有产品都能成为品牌&#xff0c;创建品牌需大量精力&#xff0c;而让品牌长久健康发展则需多方面努力。 力维网络服务众多知名品牌&#xff0c;总结出一些渠道治理方法供品牌参考。首先&#xff0c;管…

【linux】(7)文本分析awk

awk 用于分析、过滤和生成报告。 基本用法 awk pattern {action} filename常用选项 -F&#xff1a;指定字段分隔符 awk -F, {print $1} filename例子&#xff1a;使用逗号作为字段分隔符&#xff0c;并打印第一列。 -v&#xff1a;定义变量 awk -v varvalue BEGIN {print va…

分享5款让大家电脑更好用的软件

​ 电脑是我们日常生活和工作中不可缺少的工具&#xff0c;今天给大家推荐了五款让电脑更好用的软件。 1.系统清理——CCleaner ​ CCleaner是一款系统优化和隐私保护工具&#xff0c;可以清理无用文件、浏览器缓存、回收站内容等&#xff0c;释放磁盘空间&#xff0c;提升系…

【linux网络(二)】网络基础之套接字编程

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 端口号详…

2024下半年软考中级系统集成项目管理师应该如何备考?

2024年软考系统集成项目管理工程师安排在下半年考试&#xff0c;今天跟大家分享一下软考中级系统集成项目管理师的考试备考规划。 报考要求 系统集成项目管理师考试报名没有任何学历、年龄、职业等条件的限制&#xff0c;只要年满18岁就可以报名。 适合人群 各政府部门及事…

任何成为一名优秀的AI产品经理,看完这篇就懂了

&#xff08;背景:之前做AI咨询&#xff0c;对接公司内部AI产品经理经理&#xff0c;外部也对接过很多甲方AI产品经理。后来出来也拿过好几家公司AI产品经理的offer&#xff09; 1.AI产品经理是什么 回答这个问题前我们首先得理清楚什么是AI产品经理&#xff0c;它和传统的互…

JavaLambda表达式 - 操作数组

在Java中&#xff0c;Lambda表达式通常与函数式接口一起使用&#xff0c;以便能够以更简洁的方式表示函数或操作。然而&#xff0c;Java的数组本身并不直接支持Lambda表达式&#xff0c;因为数组是原生数据类型&#xff08;对于基本类型数组&#xff09;或对象的固定大小的集合…

nginx安装和配置ModSecurity

ModSecurity 是一个开放源代码的 Web 应用防火墙 (WAF)&#xff0c;可以帮助保护 Web 服务器免受各种攻击。以下是如何在 Nginx 上安装和配置 ModSecurity 的详细步骤。 一. 安装 ModSecurity &#xff08;1&#xff09;. 安装依赖 在安装 ModSecurity 之前&#xff0c;需要先…

半导体光电子学最后总结(3)光子晶体

Matrix theory 波传输矩阵 (Wave-Transfer Matrix) 散射矩阵 (Scattering Matrix) 光在均匀介质中的传播公式矩阵化 Relation between Scattering Matrix and Wave-Transfer Matrix 级联系统的投射/反射系数&#xff1a;艾里公式 (Airy Formulas) 无损对称系统 斜入射波的传输…

❤vue2项目webpack打包的优化策略

❤ vue2项目webpack打包的优化策略 &#xff08;优化前&#xff09; 现在我们的打包时间为&#xff1a; >打包体积大小为&#xff1a; 1、去除开发环境和生产环境提示以及日志 开发环境和生产环境的打印处理 生产环境去除console.log打印的两种方式 通过环境变量控制co…

终成大流:CDM+AI彻底重塑数据备份市场

进入2024年&#xff0c;CDM市场又迎来高光时刻。 先有Cohesity上演“蛇吞象”并购Veritas数据备份与数据管理业务&#xff0c;并在新一轮融资中获得IBM、NVIDIA两大巨头的战略投资&#xff1b;后有Rubrik获得资本市场认可&#xff0c;以64亿美元市值成功登陆纽交所。两大CDM明…

[Unity学习] 背景视差因子计算,远近背景移动距离差

public Camera cam;public Transform trans;Vector2 startPosiotion;float startZ;//此物距离trans的z距离private float zDistance > transform.position.z - trans.transform.position.z;void Start(){startPosiotion transform.position;startZ transform.position.z;}…

免费!快速!干货!手把手教你如何在个人电脑上搭建你自己的大模型服务!

大模型发展如火如荼&#xff0c;虽然大模型的能力强大&#xff0c;但是大模型也是非常昂贵的&#xff01;不管是训练还是推理&#xff0c;都需要耗费大量的机器&#xff0c;而且机器的硬件资源&#xff0c;比如GPU、TPU等都有一定的要求。 因此&#xff0c;业界的同行们&#x…

docker——环境搭建

准备知识 一、Docker官方架构 ​ docker使用C/S架构模式&#xff1b; ​ Docker 仓库(Registry) ​ Docker 仓库用来保存镜像&#xff0c;可以理解为代码控制中的代码仓库。Docker Hub 供了庞大的镜像集合供使用。 ​ Docker daemon ​ Docker daemon 是服务器组件&#…

Lua搭建网站后台教程

本文讲解如何使用二进制发布包和FastWeb网站管理工具搭建站点 FastWeb网站管理工具 使用该工具可快速在Windows平台部署。支持官方或三方模块的自动安装、日志调试、版本更新等。 1、下载最新版本压缩包 2、解压到任意目录(建议英文) 3、运行 ①点击 [设置]->[安装] 部…

DEV-C++小游戏吃星星(1.5)

吃星星1.5版导航 ★★★★★ 吃星星&#xff08;1.5&#xff09;★★★★★ ★★★★该版本简介更新说明★★★★ ★★★分部代码★★★ ★头文件命名空间变量★ ★★结构体★★ ★辅助结构体★ ★角色结构体★ ★星星结构体★ ★打印结构体★ ★加载中结构体★ ★游…

macOS 15 beta (24A5264n) Boot ISO 原版可引导镜像下载

macOS 15 beta (24A5264n) Boot ISO 原版可引导镜像下载 iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia-boot-iso/&#xff0c;查看最新版…

[手游] 三色绘恋S Mobile Link

语音合成TTS: 文字转成语音的工具 WPS免登录一键修改器: 去除烦人的登录且能正常使用 故事简介&#xff1a; 深秋的雨季即将到来&#xff0c;正值那个为人所熟知的故事发生的前一年—— 地点&#xff1a;湖北省的重点高中&#xff0c;武汉师贰高校。 新学年开始&#xff0c;各…