【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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

Lua搭建网站后台教程

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

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;各…

LeetCode | 2879.显示前三行

在 pandas 中&#xff0c;可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行&#xff0c;可以在 head() 方法中传入一个参数 n&#xff0c;读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…

前沿重器[49] | 聊聊搜索系统2:常见架构

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

分布式高性能计算 (HPC)的工作负载管理平台和作业调度程序—— IBM Spectrum® LSF® Suites

IBM Spectrum LSF Suites 是面向分布式高性能计算 (HPC) 的工作负载管理平台和作业调度程序。基于 Terraform 的自动化现已可用&#xff0c;该功能可在 IBM Cloud 上为基于 IBM Spectrum LSF 的集群供应和配置资源。 借助我们针对任务关键型 HPC 环境的集成解决方案&#xff0…

弘君资本股市资讯:增逾20倍!百亿细分龙头利好来了

5月以来&#xff0c;A股进入了时间短的成绩发表空档期&#xff0c;而百亿化工细分龙头齐翔腾达&#xff0c;则以一份高增的成绩预告&#xff0c;摆开半年报成绩预告发表序幕。 6月10日晚间&#xff0c;齐翔腾达发表的成绩预告显现&#xff0c;上半年估计完成归母净赢利1.3亿元…

神经网络 torch.nn---Pooling layers(nn.MaxPool2d)

torch.nn — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) nn.MaxPool2d class torch.nn.MaxPool2d(kernel_size, strideNone, padding0, dilation1, return_indicesFalse, ceil_modeFalse) 参数介绍 kernel_size(int or tuple) - …

AI机器人公众号小程序h5源码开源交付支持二开黑色风格版本

AI机器人系统对接OPENAI&#xff1a;开启智能新纪元 更新全新UI、新增全家桶模块、新增热榜板块、支持语音朗读、支持快速回答、支持AI绘图、支持文字一键生成图、支持导出pdf、支持导出word、支持导出文字、支持快速响应、支持中英翻译、支持markdown &#x1f680;一、引言…

还在为复制粘贴烦恼吗?这5个工具帮你轻松搞定

在日常工作中&#xff0c;CtrlC和CtrlV无疑是我们使用最为频繁的快捷键组合。 复制粘贴&#xff0c;轻松快捷。 但是在使用中&#xff0c;也会有一点不便&#xff0c;那就是无法保存剪贴历史内容。 比如我说复制之后&#xff0c;我想要想要找回这一次复制之前的内容&#xf…

调用华为云实现人证核身证件版(二要素)

目录 1.作者介绍2.华为云人证核身2.1什么是人证核身2.2应用场景2.3限制要求 3.流程介绍3.1调用API实现3.2调用SDK实现 1.作者介绍 高凡平&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究方向&#xff1a;数码印花缺陷检测 电子邮件&#xf…

下载NVIDIA官网的培训视频,生成中文字幕和PPT

下载NVIDIA官网的培训视频,生成中文字幕和PPT 一.[视频网站](https://www.nvidia.cn/on-demand/session/gtc24-s62129/)二.如何获取视频的原始链接三.下载视频的脚本【生成output.mp4】四.安装whisper环境【语音识别生成英文字幕】五.下载whisper模型六.生成英文字幕【输出merg…