语言文件操作

news2024/9/20 18:39:12

🌱博客主页:大寄一场.

🌱系列专栏:C语言学习笔记

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注 

 

目录

前言

C语言中的文件打开和关闭

文件指针

文件的打开和关闭

fclose

文件的顺序读写

fseek

ftell

rewind

文本文件和二进制文件

文件读取结束的判定

被错误使用的feof

文件缓冲

总结


 

 

前言


我们或许都有这样的苦恼,在我们使用C语言进行编程的时候,当我们程序写好跑起来之后,我们输入的数据总是在关闭之后就丢失,有些东西比如我们的通讯录实现,想要将这些数据保存,下次打开还在,我们应该怎么做?这里就让我带领大家进入文件这个奇妙的空间。

文件是什么?

磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)

程序文件

我们在编译器里面创建的文件,比如后缀为.c的源程序文件,在我们windows环境当中后缀为.obj的目标文件,还有我们后缀为.exe的可执行程序,这些文件一般是在我们程序设计时候所产生。

数据文件

对于文件来说,里面的东西不是必须要为程序的,我们在程序的设计过程中,会读写数据,这些数据的来源,就是这些数据文件。

文件名
文件和我们一样,都有一个独一味二的名字,它们的名字构成不和我们一样,姓+名,它是由我们的文件路径+文件名主干+文件后缀,那我们知道文件后缀是什么,也知道当时文件命名时候命名的主干是什么,那这个文件路径是什么呢?文件路径,顾名思义,是文件走过的路径,这样想就大漏特漏,文件路径指的是,我们去找这个文件所途经的文件,比如我现在要在我的电脑中,找到我昨天写的代码,我知道我的代码放在d盘一个集中的文件当中,那我就可以去找一下d:\code\test-c
 

 

C语言中的文件打开和关闭

文件指针

在我们探讨在C语言中怎么打开和关闭文件之前,我们要了解一个概念,叫文件指针,

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

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

不同编译器下的结构体内部可能存在差异,但是是不影响我们使用的,每要打开一个文件,FILE内部会自己判断应该是什么类型,不需要使用者去担心这些细节,我们在使用FILE的时候,通常情况下是用一个指针去维护的,我们这里可以试着去创建一个FILE*的变量。

FILE* pf; //文件指针类型

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

比如:

 

文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指
针和文件的关系

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件


fopen

fopen,是我们用来打开文件的函数,它的第一个参数就是我们的文件名,第二个参数是打开方式,打开方式有很多。如下:

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


我们知道这些打开方式之后,就可以试着打开文件了,这里我们试一下用只读的方式打开文件。

#include<stdio.h>

int main()
{
    FILE* pf;
    pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        perror(pf);
        return 1;
    }
    //操作文件

    //
    return 0;
}


fclose


我们的文件和动态内存一样,我们打开用完之后,是需要关闭的,那用于关闭文件的函数就是我们的fclose,它的使用和我们动态内存的free基本一样,那我们优化一下上面的代码。

#include<stdio.h>

int main()
{
    //打开文件
    FILE* pf;
    pf = fopen("test.txt", "r");
    //判断文件打开是否成功
    if (pf == NULL)
    {
        perror(pf);
        return 1;
    }
    //操作文件

    //
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}


文件的顺序读写


我们文件打开之后,要对文件进行操作,这里就要用到我们的文件读写了,在C语言中提供了很多用于读写的函数,这里给大家列出一个表格。

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


对于上述的这些函数而言,所有输入/输出流这些函数都是文本信息,我们写入到文本当中是可以看懂的,最后两个二进制输入函数,它输入到文本当中的是ASCII码,我们不能直观的知道我们存放在内存中的数据是什么。

文件的随机读写
我们学习了文件的顺序读写,那如果我们读写了文件内的第一个字符,我们还想读取第一个怎么办?如果是顺序读写时做不到的,那这里就有了我们的随机读写。

fseek

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

根据文件指针的位置和偏移量来定位文件指针,它第一个参数放的是我们的文件指针,第二个是要便宜多少,第三个就是我们从哪里开始算偏移位置,第三个参数在我们C语言中是由提供的。

ftell

long int ftell ( FILE * stream );

ftell,它可以计算我们文件指针相比较起始位置的偏移量,然后返回这个值。

rewind

void rewind ( FILE * stream );

fewind,它可以将我们的文件指针直接回到文件的初始位置。

文本文件和二进制文件


根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)
 

文件读取结束的判定

被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数

文件缓冲

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

总结


文件操作对于我们来说,可以让一些我们需要保存的数据放在文件当中,下次使用的时候可以直接写入到程序当中。


那么这篇博客就到此为止了,希望佬们多多支持!
 

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

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

相关文章

Flink-多流转换(Union、Connect、Join)

文章目录多流转换分流基本合流操作联合&#xff08;Union&#xff09;连接&#xff08;Connect&#xff09;基于时间的合流——双流联结&#xff08;Join&#xff09;窗口联结&#xff08;Window Join&#xff09;间隔联结&#xff08;Interval Join&#xff09;窗口同组联结&a…

【Vue3】组件数据懒加载

组件数据懒加载-基本使用 目标&#xff1a;通过useIntersectionObserver优化新鲜好物和人气推荐模块 电商类网站&#xff0c;尤其是首页&#xff0c;内容有好几屏&#xff0c;而如果一上来就加载所有屏的数据&#xff0c;并渲染所有屏的内容会导致首页加载很慢。 数据懒加载&a…

Java面试题--熔断和降级的区别

熔断和降级都是系统自我保护的一种机制&#xff0c;但二者又有所不同&#xff0c;它们的区别主要体现在以下几点&#xff1a; 概念不同 触发条件不同 归属关系不同 1.概念不同 1.1熔断概念 “熔断”一词早期来自股票市场。熔断&#xff08;Circuit Breaker&#xff09;也…

Python3-数据类型转换

有时候&#xff0c;我们需要对数据内置的类型进行转换&#xff0c;数据类型的转换&#xff0c;一般情况下你只需要将数据类型作为函数名即可。 Python 数据类型转换可以分为两种&#xff1a; 隐式类型转换 - 自动完成 显式类型转换 - 需要使用类型函数来转换 隐式类型转换 在…

一图说明 monorepo 落地流程方案

关于 monorepo 初次讨论已有2年载&#xff0c;目前团队已经沉淀了成熟的技术方案且经受住了实战考验。所以特梳理相关如下&#xff1a; 也算是关于之前发起的 monorepo–依赖 的解答篇。 上图为目前团队贡献的主流程&#xff1a;① 本地开发 > ② 提交Git仓库 > ③ 触发…

网络安全高级攻击

对分类器的高层次攻击可以分为以下三种类型&#xff1a;对抗性输入&#xff1a;这是专门设计的输入&#xff0c;旨在确保被误分类&#xff0c;以躲避检测。对抗性输入包含专门用来躲避防病毒程序的恶意文档和试图逃避垃圾邮件过滤器的电子邮件。数据中毒攻击&#xff1a;这涉及…

一种改善调制宽带变换器的有意混叠方法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

【数组与链表算法】矩阵算法在程序中常见的简单应用 | C++

第二十三章 矩阵算法 目录 第二十三章 矩阵算法 ●前言 ●矩阵算法与深度学习 ●一、矩阵相加 ●二、矩阵相乘 ●三、矩阵转置 ●四、稀疏矩阵 ●总结 前言 数组与链表都是相当重要的结构化数据类型&#xff0c;也都是典型线性表的应用。线性表用于计算机中的数据存储结构…

SpringCloud-学习笔记(五)nacos集群环境搭建

参考视频 集群搭建步骤 搭建MySQL集群并初始化数据库表 下载解压nacos 修改集群配置&#xff08;节点信息&#xff09;、数据库配置 分别启动多个nacos节点 nginx反向代理 安装数据库 官方的建议是使用MySQL组词给模式的高可用集群&#xff0c;这里为了方便演示&#xff0c;仅…

【大厂高频必刷真题100题】《有序矩阵中第 K 小的元素》 真题练习第27题 持续更新~

有序矩阵中第 K 小的元素 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n^2) 的解决方案。 示例 1: 输入:matrix = [[1,5,9…

makefile编写

文章目录什么是编译器GCC 编译器编写makefile什么是编译器 C语言代码由固定的词汇按照固定的格式组织起来&#xff0c;简单直观&#xff0c;程序员容易识别和理解&#xff0c;但是对于CPU&#xff0c;C语言代码就是天书&#xff0c;根本不认识&#xff0c;CPU只认识几百个二进…

Windows 免安装版mysql,快速配置教程

简单步骤 下载并解压mysql压缩包&#xff0c;把 “<mysql根目录>/bin” 路径添加到系统环境变量path中命令行执行 mysqld --initialize --console&#xff0c;初始化data目录&#xff08;数据库表文件默认存放在" <mysql安装根目录>/data "目录下&#…

JavaScript Web API 来构建你不了解的网站

随着技术的日新月异&#xff0c;为开发人员提供了令人难以置信的新工具和API。 但据了解&#xff0c;在100 多个 API中&#xff0c;只有5%被开发人员积极使用。 随着技术的日新月异&#xff0c;为开发人员提供了令人难以置信的新工具和API。但据了解&#xff0c;在100 多个 A…

使用pytorch构建resnet50-v2

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 resnet-v2改进点以及和v1差别 &#x1f9f2; 改进点&#xff1a; (a)original表示原始的ResNet的残差结构&#xff0c;(b)proposed表示新的…

【Spring Cloud Alibaba】(四)Dubbo框架介绍 及 整合Dubbo和OpenAI实战【文末附源码】

系列目录 【Spring Cloud Alibaba】&#xff08;一&#xff09;微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】&#xff08;二&#xff09;微服务调用组件Feign原理实战 【Spring Cloud Alibaba】&#xff08;三&#xff09;OpenFeign扩展点实战 源码详解 本文目…

干货| 三大软件架构对比与分析

从系统的组织和部署结构方面来看&#xff0c;软件架构的演化进程显然有着从简单到复杂的趋势。那是否最新最复杂的架构就是目前业界选择的最佳架构呢&#xff1f;非也。没有最好的架构&#xff0c;只有最合适的架构。在软件架构的选择上&#xff0c;“合适”比“新”更加重要。…

11.注意力机制

11.注意力机制 目录 注意力提示 查询、键和值 注意力的可视化 注意力汇聚&#xff1a;Nadaraya-Watson 核回归 生成数据集 非参注意力池化层 Nadaraya-Watson核回归 参数化的注意力机制 批量矩阵乘法 定义模型 训练 注意力评分函数 掩蔽softmax操作 加性注意力 缩…

家政服务小程序实战开发教程015-填充用户信息

我们上一篇讲解了立即预约功能&#xff0c;存在的问题是&#xff0c;每次都需要用户填写联系信息。在我们前述篇章中已经介绍了用户注册的功能&#xff0c;在立即预约的时候我们需要把已经填写的用户信息提取出来&#xff0c;显示到表单对应的字段中。本篇我们就讲解一下如何提…

K8S+Jenkins+Harbor+Docker+gitlab集群部署

K8SJenkinsHarborDockergitlab服务器集群部署 目录K8SJenkinsHarborDockergitlab服务器集群部署1.准备以下服务器2.所有服务器统一处理执行2.1 关闭防火墙2.2 关闭selinux2.3 关闭swap&#xff08;k8s禁止虚拟内存以提高性能&#xff09;2.4 更新yum (看需要更新)2.5 时间同步2…

【自监督论文阅读笔记】MVP: Multimodality-guided Visual Pre-training

Abstract 最近&#xff0c;掩码图像建模&#xff08;MIM&#xff09;已成为视觉预训练的一个有前途的方向。在vision transformers的上下文中&#xff0c;MIM 通过将 token-level 标记级特征 与 预定义空间 对齐来学习有效的视觉表示&#xff08;例如&#xff0c;BEIT 使用在大…