数据文件操作

一、什么是文件?

        硬盘(磁盘)上的文件是文件。

        在程序设计中,我们从文件功能的角度来分类的话,可以分为程序文件和数据文件。

1.1程序文件

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

2.2数据文件

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

        而本章所讨论的即为数据文件。

二、为什么要使用文件

        如果没有文件,我们所写的程序的数据存储在电脑的内存中,如果程序退出,内存回收,因此数据就丢失,当下次再想读取上一次的程序数据时,就找不到了,如果想对数据进行持久化的保存,那就要用到文件了。

三、文件名

        ⼀个文件要有⼀个唯⼀的文件标识,以便⽤户识别和引用。

        文件名包含三个部分:文件路径+文件名主干+文件后缀

        例如:D:\program\program-house.txt

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

        根据数据的组织形式,数据文件被称为文本文件和二进制文件。

        数据在内存中以二进制的形式存储,如果不加转换的输出到外存文件中,就是二进制文件。

        如果要求在内存中以ASCII方式存储,则需要在存储前转换。以ASCII码字符的形式存储的文件就是文本文件。

五、文件的打开和关闭

        文件在读写之前必须先打开文件,使用结束后再关闭文件。

        编写程序时,在打开文件的同时会返回一个(FILE*)类型的指针来指向该文件,相当于建立了指针和文件的关系。

        ANSIC规定打开文件使用“fopen”,关闭文件使用“fclose”。

代码一:

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

代码二:

#include<stdio.h>int main()
{//用“写”的方式打开文件FILE* pf = fopen("program.txt", "w");//判断文件是否打开成功,如果打开失败则提前返回。if (pf == NULL){perror("fopen");return 1;}//文件操作//关闭文件fclose(pf);pf = NULL;return 0;
}

        代码一中“const char * mode”表示文件的打开模式,如下进行模式的列举整理:

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

代码演示:

int main()
{//打开一个名为program.txt的文件,如果没有该文件则新建一个FILE* pf = fopen("program.txt", "w");if (pf==NULL){perror("fopen");return 1;}fputs("abcdefghi\n", pf);char ch = 'a';for (char i = ch; i <= 'z'; i++){fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}

没运行程序之前,program.txt文件的内容为空,如图所示:

运行程序之后,program.txt文件的内容为:

        现在,我们把当前的program.txt文件删掉,然后把文件模式改成只读模式,运行程序。就会发现perror就会报错。

int main()
{//打开一个名为program.txt的文件,如果没有该文件则新建一个FILE* pf = fopen("program.txt", "r");if (pf==NULL){perror("fopen");return 1;}
#if 0fputs("abcdefghi\n", pf);char ch = 'a';for (char i = ch; i <= 'z'; i++){fputc(i, pf);}
#endiffclose(pf);pf = NULL;return 0;
}

        在日常编写程序时,我们要时刻谨记在使用完文件时,要及时的关闭文件。

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

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

相关文章

CAN总线系列一:初识CAN总线

CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称&#xff0c;它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的&#xff0c;并最终成为国际标准&#xff08;ISO11519&#xff09;&#xff0c;是国际上应用最广泛的现场总线之一。 一、总线特点&#…

夜晚水闸3D可视化:科技魔法点亮水利新纪元

在宁静的夜晚&#xff0c;当城市的霓虹灯逐渐暗淡&#xff0c;你是否曾想过&#xff0c;那些默默守护着城市安全的水闸&#xff0c;在科技的魔力下&#xff0c;正焕发出别样的光彩&#xff1f;今天&#xff0c;就让我们一起走进夜晚水闸3D模型&#xff0c;感受科技为水利带来的…

物联网实战--入门篇之(一)物联网概述

目录 一、前言 二、知识梳理 三、项目体验 四、项目分解 一、前言 近几年很多学校开设了物联网专业&#xff0c;但是确却地讲&#xff0c;物联网属于一个领域&#xff0c;包含了很多的专业或者说技能树&#xff0c;例如计算机、电子设计、传感器、单片机、网…

uniapp框架中H5模式选择图片后Blob对象的使用

在uniapp框架中使用uni.chooseImage()时,发现在浏览器访问的情况下,res的数据结构如下,和在小程序访问下的结果不一样。 { "errMsg":"chooseImage:ok", "tempFilePaths":["blob:http://localhost:8080/53ff91e0-9730-4c89-95d7-1e29466…

C语言如何实现函数单个形参添加默认值

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff08;2&#xff0…

大话设计模式之简单工厂模式

简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;属于工厂模式的一种。在简单工厂模式中&#xff0c;有一个工厂类负责根据输入参数的不同来创建不同类的实例。 简单工厂模式包含以下几个要素&#xff1a; 1. **工厂类&#xff0…

牛客的一道题(C)变种水仙花

描述&#xff1a; 变种水仙花数 - Lily Number&#xff1a;把任意的数字&#xff0c;从中间拆分成两个数字&#xff0c;比如1461 可以拆分成 &#xff08;1和461&#xff09;,&#xff08;14和61&#xff09;,&#xff08;146和1),如果所有拆分后的乘积之和等于自身&#xff…

Qlib-Server部署

Qlib-Server部署 介绍 构建Qlib服务器,用户可以选择: 一键部署Qlib服务器逐步部署Qlib服务器一键部署 Qlib服务器支持一键部署,用户可以选择以下两种方法之一进行一键部署: 使用docker-compose部署在Azure中部署使用docker-compose进行一键部署 按照以下步骤使用docker…

day72Html

常用标签&#xff1a; 分类&#xff1a; 块级标签&#xff1a;独立成行 行级标签&#xff1a;不独立成行&#xff0c;同一行可放多个行级标 注意网页显示时&#xff0c;忽略空白字符,(回车符&#xff0c;空格&#xff0c;tab制表符&#xff09; 一&#xff09;块级标签&#xf…

python中的deque详解

deque&#xff08;双端队列&#xff09;是Python标准库collections模块中的一个类&#xff0c;它支持从两端快速添加和删除元素。deque为固定大小或者可变大小的队列提供了线程安全的实现&#xff0c;并且它比使用列表&#xff08;list&#xff09;来实现相同的功能更为高效。 …

.NET core 5.0 及以上的Windows Service开发

首先&#xff0c;一定要和.NET Framework区分开&#xff0c; 详细请看微软的2023年的最新官方文档 Create Windows Service using BackgroundService - .NET | Microsoft Learn Create a Windows Service installer - .NET | Microsoft Learn 同样微软的官方微博给出了开发…

【明道云】如何让用户可以新增但不能修改记录

【背景】 遇到一个需求场景&#xff0c;用户希望新增数据后锁住数据不让更改。 【分析】 在设计表单时直接将字段设置只读是不行的。字段设置只读将会直接让界面上此字段的前端组件不可编辑。包括新增时也无法填入。显然是不符合需求的。 需要既能新增&#xff0c;新增后又不…

【WebJs 爬虫】逆向进阶技术必知必会

前言 在数字化时代&#xff0c;网络爬虫已成为一种强大的数据获取工具&#xff0c;广泛应用于市场分析、竞争对手研究、舆情监测等众多领域。爬虫技术能够帮助我们快速、准确地获取网络上的海量信息&#xff0c;为决策提供有力支持。然而&#xff0c;随着网络环境的日益复杂和…

猫,路由器,WIFI

家庭网络常识 1&#xff1a;猫、路由器、wifi_哔哩哔哩_bilibili 入户光纤插到猫上面&#xff0c;网线连接猫和路由器&#xff0c;网线连接路由器和电脑。路由器可以发射WIFI。 手机通过WIFI连接到路由器。 左边是猫&#xff0c;右边是光猫。 &#xff08;modem&#xff09; …

重学SpringBoot3-SpringBoot可执行JAR的原因

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SpringBoot可执行JAR的原因 Spring Boot可执行JAR的结构打包运行JAR 包内部结构 工作原理优点总结 Spring Boot 的一个核心特性是它的可执行 JAR&#x…

88. 合并两个有序数组(javascript)

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

QML通过鼠标拖动的位置

当通过鼠标拖动Rectangle 的位置时&#xff0c;可以使用Qt Quick的MouseArea组件来实现 Rectangle {id: rectx:0;y:0width: 200; height: 100color: "lightblue"MouseArea {id: mouseAreaanchors.fill: parentdrag.target: rect//要拖动的项目的IDdrag.axis: Drag.XA…

25G SFP28 AOC线缆最新数据传输解决方案

在当今云计算、大数据、人工智能等领域&#xff0c;对高速数据传输的需求不断增加。传统的1G和10G网络已经无法满足数据中心日益增长的流量&#xff0c;因此迫切需要更高速的解决方案。25G SFP28 AOC有源光缆迎合了这一需求&#xff0c;成为连接数据中心、服务器、存储等25G设备…

游戏客户客户端面经

C#和C的类的区别C# List添加100个Obj和100 int内存是怎么变化的重载和重写的区别&#xff0c;重载是怎么实现的重写是怎么实现的&#xff1f;虚函数表是类的还是对象的用过哪些C的STLVector底层是怎么实现的Vector添加一百次数据内存是怎么变化Map的底层&#xff0c;红黑树的查…

增强现实(AR)和虚拟现实(VR)营销的未来:沉浸式体验和品牌参与

--- 如何将AR和VR技术应用于营销&#xff0c;以提高品牌知名度、客户参与度 增强现实&#xff08;AR&#xff09;和虚拟现实&#xff08;VR&#xff09;不再只是游戏。这些技术为品牌与受众互动提供了创新的方式。营销人员可以创造更好的客户体验&#xff0c;并为身临其境的故…