【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件,fopen,fclose【图文详解】

欢迎来CILMY23的博客喔,本篇为【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注+收藏。

前言

在了解完动态内存管理,我们本期将使用一些文件指针来对外部文件进行操作

前两期博客:

动态内存管理1:

【C语言】内存操作篇---动态内存管理----malloc,realloc,calloc和free的用法【图文详解】-CSDN博客

动态内存管理2:

【C语言】动态内存管理------常见错误,以及经典笔试题分析,柔性数组【图文详解】-CSDN博客

目录

一、为什么会有文件?

二、什么是文件?

2.1程序文件

2.2数据文件 

2.3之间的区别 

三、文件名 

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

五、文件的打开和关闭

 4.1流和标准流

4.1.1流

4.1.2标准流

4.2文件指针

4.3文件的打开和关闭

4.3.1 fopen

4.3.2 fclose 

fopen和fclose的使用 

 文件操作的表格:


一、为什么会有文件?

文件存在的主要目的是为了存储、组织和共享信息,而在计算机学习中,我们知道在内存上运行的东西,如果程序退出了,内存就会被回收,我们需要长期存储,就有了文件来进行存储,而文件是存储到硬盘上的,可以长期保存。

二、什么是文件?

文件是计算机存储数据的一种方式,它可以存储文本、图像、音频、视频等各种类型的信息。文件通常由一个或多个字符序列组成,每个字符可以是字母、数字、符号或控制字符。文件通常被保存在计算机的存储介质(例如硬盘、固态硬盘、光盘)中,并用于存储和传输数据。文件可以通过文件管理系统进行访问、编辑和管理。在计算机系统中,文件是组织和处理数据的基本单位,它们被用于存储和传输各种类型的信息。

2.1程序文件

程序文件(也称为可执行文件或代码文件)是包含计算机程序代码的文件。它们通常包含一系列指令和命令,告诉计算机如何执行特定的任务。程序文件在计算机上运行时,会被解释和执行,从而实现特定的功能。

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

win11下的图标:

2.2数据文件 

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。数据文件是存储数据信息的文件(本篇主要讨论数据文件),它们包含特定领域的数据,例如文本文件、图像文件、音频文件、视频文件等。数据文件用于存储和保存实际的数据内容,这些数据可以被程序文件读取、处理和操作。

数据文件可以存储各种类型的数据,例如文本文件中存储文本内容,图像文件中存储图像数据等。

常见的数据文件类型:

  1. 文本文件:

    • .txt文件:存储文本内容,例如存储程序代码、日志文件等。
    • .csv文件:存储以逗号分隔的数据,例如存储表格数据、统计数据等。
    • .json文件:存储以JSON格式表示的数据,例如存储配置文件、API响应数据等。
    • .xml文件:存储以XML格式表示的数据,例如存储配置文件、数据传输等。
    • .html文件:存储超文本标记语言,用于网页的展示。
  2. 图像文件:

    • .jpg或.jpeg文件:用于存储压缩的数字图像,常用于照片和图像的传输和显示。
    • .png文件:用于存储无损压缩的数字图像,支持透明背景,常用于Web图像和图形设计。
    • .gif文件:用于存储动画图像,支持多帧的图像文件格式。
    • .bmp文件:无损位图格式,用于存储图像数据的原始位图信息。
  3. 音频文件:

    • .mp3文件:常用的音频压缩格式,用于存储音乐、声音等。
    • .wav文件:无损音频格式,用于存储音频数据的原始波形信息。
  4. 视频文件:

    • .mp4文件:常用的视频压缩格式,用于存储视频数据,适合在Web和移动设备上播放。
    • .avi文件:Windows系统中常用的视频格式,支持多种视频和音频编解码器。
    • .mov文件:苹果公司开发的视频格式,通常用当谈到数据文件时

2.3之间的区别 

程序文件包含计算机程序的代码和指令,用于实现特定功能,并由计算机解释和执行。而数据文件则是存储实际数据信息的文件,供程序文件读取、处理和操作。简单来说,程序文件是计算机指令的集合,控制计算机的行为;数据文件是实际数据的存储媒介,供程序文件使用。

三、文件名 

文件名是指文件在文件系统中的名称。它是用来标识特定文件的字符串,并用于定位、访问和识别文件。文件名通常包括两部分:文件的名称和文件的扩展名(后缀)

  1. 文件名称:文件名称是文件的主要标识,用于描述文件的内容或作用。文件名称可以由字母、数字和一些特殊字符组成,但通常不包含文件系统不允许的特殊字符和空格。文件名称一般应具有描述性,以方便用户和开发者快速识别和查找文件。例如,对于一个名为"example.txt"的文本文件,"example"就是文件的名称。

  2. 扩展名(后缀):扩展名是文件名中的一部分,用于标识文件的类型或格式。扩展名出现在文件名的最后,通常由一个点(.)和几个字母组成。扩展名可以直接指示用于打开或处理文件的程序。例如,对于一个名为"example.txt"的文本文件,".txt"就是该文件的扩展名,它表示这是一个文本文件。

 而一个文件要有一个唯一的文件标识,以便用户识别和引用。
而我们更常说的文件名包含3部分:文件路径+文件名主干+文件后缀
例如:  C:\code\test.txt
为了方便,文件标识常被称为文件名。

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

 按照数据的组织形式,我们又把数据文件称为二进制文件(文本文件)

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

⼀个数据在内存中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,磁盘读取的信息就是,‘1’,‘0’,‘0’,‘0’,‘0’,则磁盘中占用5个字节(每个字符⼀个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2019测试)。

五、文件的打开和关闭

 4.1流和标准流

4.1.1流

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

4.1.2标准流

 我们操作文件需要打开流,为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语言程序在启动的时候,默认打开了3个流:
        •    stdin - 标准输入流,在大多数的环境中从键盘输入。
        •    stdout - 标准输出流,大多数的环境中输出至显示器界面。
        •    stderr - 标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。 stdin、stdout、stderr三个流的类型是:  FILE* ,通常称为文件指针。
C语言中,就是通过  FILE* 的文件指针来维护流的各种操作的。

4.2文件指针

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

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结构的变量,并填充其中的信 息,使用者不必关心细节。
⼀般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加⽅便。

创建一个 FILE的指针变量:

FILE* pf;

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

4.3文件的打开和关闭

 文件的操作一共有三步:

1.打开文件

2.操作文件

3.关闭文件

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

4.3.1 fopen

fopen可以在cplusplus网查询: 

fopen - C++ Reference (cplusplus.com)

 函数原型如下:

FILE * fopen ( const char * filename, const char * mode );

函数介绍如下:

函数的使用和案例如下:

fopen的介绍

fopen的介绍:

fopen的原型中有两个形参, const char * filename, const char * mode,filename就是一个文件名,我们这里说的文件名,通常都是文件路径+文件名主干+文件后缀,其次是mode,mode有方式方法的意思,这里说的就是我们用什么方式打开这个文件,方式对应的是表格中的字符

这里是edge的翻译如下: 

4.3.2 fclose 

fclose可以在cplusplus查询: 

fclose - C++ Reference (cplusplus.com)

 fclose的介绍:

 fclose的功能和使用案例:

 fclose的介绍

 fclose函数是C语言中用于关闭文件的函数。它用于将打开的文件与文件指针断开连接,并释放相关资源。ANSIC规定使用  fopen 函数来打开文件,fclose 来关闭文件。注意,在关闭文件之前,务必确保对文件的所有读写操作都已完成,否则可能会导致数据丢失或其他错误。此外,如果文件未成功打开(文件指针为NULL),则不应使用fclose函数来关闭文件。

fopen和fclose的使用 

打开当前目录中的文件: 

#include<stdio.h>int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return ;}fclose(pf);pf = NULL;
}

fopen和fclose的使用如上,在上述示例中,先使用fopen函数打开一个文件text.txt并获得一个文件指针,然后对文件进行操作,最后使用fclose函数关闭文件。关闭文件后,可以确保在程序中不再使用该文件。 

如果我们并未发现文件,我们就使用perror直接打印出错误信息。

效果如下:

 打开成功:

打开绝对路径的文件: 

#include<stdio.h>int main()
{FILE* pf = fopen("E:\\Users\\云山若汐\\Desktop\\新建 文本文档 (2).txt", "r");if (pf == NULL){perror("fopen");return ;}fclose(pf);pf = NULL;
}

失败:

成功:

 打开相对路径,C语言用.表示当前目录,..表示上一级目录

 这是我的当前路径:C:\Users\云山若汐\source\repos\test2\test2

而我现在把文件放到repos下:

我的文件路径可以写成./../../test.txt

#include<stdio.h>int main()
{FILE* pf = fopen("./../../test.txt", "w");if (pf == NULL){perror("fopen");return ;}fclose(pf);pf = NULL;
}

失败: 

成功:

 文件操作的表格:

感谢各位同伴的支持,本期文件操作篇就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。    

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

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

相关文章

QT:用opencv的KNN识别图片中的LED数字(一)

前言 一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。 (正在写,未完成,稍候) 效果一预览: 效果二预览: 效果三预览: 正在写。。。 设计思路 1. 软件UI设计 2. …

leetcode刷题(javaScript)——堆相关场景题总结

堆是什么&#xff1f;堆都能用树表示&#xff0c;并且一般树的实现都是利用链表。平时使用的最多的是二叉堆&#xff0c;它可以用完全二叉树表示&#xff0c;二叉堆易于存储&#xff0c;并且便于索引。在堆的实现时注意&#xff1a;因为是数组&#xff0c;所以父子节点的关系就…

Palworld幻兽帕鲁管理员操作手册

Palworld幻兽帕鲁管理员操作手册 大家好我是艾西&#xff0c;在我们搭建完幻兽帕鲁服务器后肯定会涉及到后期的维护比如&#xff1a;角色修改&#xff0c;帕鲁修改&#xff0c;异常删除&#xff0c;公会修改&#xff0c;清理玩家&#xff0c;清理建筑&#xff0c;存档迁移等数…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

脚手架cli快速创建Vue2/Vue3项目

前言&#xff1a; 本文的nodejs版本是14.21.3 第一步 进入cmd窗口 1、全局安装webpack npm install webpack-g&#xff0c; npm install webpack-g 第二步 2、全局安装vue脚手架 npm install -g vue/cli 第三步 3、初始化vue项目 &#xff08;vue脚手架使用webpack模…

ArcGIS学习(十五)用地适宜性评价

ArcGIS学习(十五)用地适宜性评价 本任务给大家带来的内容是用地适宜性评价。 用地适宜性评价是大家在平时工作中最常接触到的分析场景之一。尤其是在国土空间规划的大背景下,用地适宜性评价变得越来越重要。 此外,我们之前的任务主要是使用矢量数据进行分析。本案例是主讲…

多线程(volatile)

volatile的功能 保证内存可见性禁止指令重排序 内存可见性 简单的理解 两(多)个线程同时针对一个变量进行操作, 一个线程读, 一个线程修改, 此时读到的值不一定是修改过后的值 即读线程没有感知到变量的变化 (其实是 编译器/JVM 对于代码在多线程情况下的优化进行了误判) 从 J…

Vue3 + antv/x6 实现流程图

新建流程图 // AddDag.vue <template><div class"content-main"><div class"tool-container"><div click"undo" class"command" title"后退"><Icon icon"ant-design:undo-outlined" /…

初识Python语言-课堂练习【pyhton123题库】

初识Python语言-课堂练习【pyhton123题库】 一、单项选择题 1、Guido van Rossum正式对外发布Python版本的年份是&#xff1a; A 2008B 1998C 1991D 2002 【答案】C 【解析】暂无解析2、下面不是Python语言特点的是&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪…

无需编程技能:Python爬虫与数据可视化毕业论文代写服务

引言 作为一名在软件技术领域深耕多年的专业人士,我不仅在软件开发和项目部署方面积累了丰富的实践经验,更以卓越的技术实力获得了🏅30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定,也是对我的创新精神和专业承诺的认可。我的专业知识涵盖了从前端界面设…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行&#xff0c;然后切换到Release模式下&#xff0c;也正常运行&#xff0c;把第三方平台的dll拷贝到exe所在…

honle电源维修UV电源控制器维修EVG EPS60

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

React组件(函数式组件,类式组件)

函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!-- 引…

基于FPGA加速的bird-oid object算法实现

导语 今天继续康奈尔大学FPGA 课程ECE 5760的典型案例分享——基于FPGA加速的bird-oid object算法实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 模型说明 Bird-oid object …

镭雕机:如何利用激光技术实现高质量的产品标记

镭雕机是一种利用激光技术实现高质量产品标记的设备。它通过激光束在各种不同的物质表面进行精确的打标&#xff0c;可以产生永久性的标记效果&#xff0c;这些标记不仅精美&#xff0c;而且具有高度的精度和清晰度。以下是镭雕机如何利用激光技术实现高质量产品标记的详细过程…

寄存器(内存访问)

文章目录 寄存器&#xff08;内存访问&#xff09;1 内存中字的存储2 DS和[address]3 字的传送4 mov、add、sub指令5 数据段6 栈7 CPU提供的栈机制8 栈顶超界的问题9 push、pop指令10 栈段 寄存器&#xff08;内存访问&#xff09; 1 内存中字的存储 CPU中&#xff0c;用16位寄…

Spring Cloud Gateway如何实现熔断

Spring Cloud Gateway熔断集成 熔断应用&#xff1a; 金融市场中的熔断机制&#xff1a;在金融交易系统中&#xff0c;熔断机制&#xff08;Circuit Breaker&#xff09;是一种市场保护措施&#xff0c;旨在预防市场剧烈波动时可能导致的系统性风险。当某个基准指数&#xff08…

基于Ambari搭建大数据分析平台

一、部署工具简介 1. Hadoop生态系统 Hadoop big data ecosystem in Apache stack 2. Hadoop的发行版本 Hadoop的发行版除了Apache的开源版本之外&#xff0c;国外比较流行的还有&#xff1a;Cloudera发行版(CDH)、Hortonworks发行版&#xff08;HDP&#xff09;、MapR等&am…

【网络安全】-数字证书

数字证书 数字证书是互联网通讯中用于标志通讯各方身份信息的一串数字或数据&#xff0c;它为网络应用提供了一种验证通信实体身份的方式。具体来说&#xff0c;数字证书是由权威的证书授权&#xff08;CA&#xff09;中心签发的&#xff0c;包含公开密钥拥有者信息以及公开密…

linux中将终端Terminal添加到任务栏

问题描述 如题&#xff0c;默认的任务栏中没有终端这一组件&#xff0c;因此&#xff0c;想要打开终端&#xff0c;需要先切换到桌面&#xff0c;影响了使用体验。 解决方法 1.在applications里找到Terminal Emulator。 2.将Terminal Emulator拖动到任务栏&#xff0c;即可…