C语言进阶——文件的打开(为什么使用文件、什么是文件、文件的打开和关闭)

目录

为什么使用文件

什么是文件

程序文件

数据文件

文件名

文件的打开和关闭

文件指针

打开和关闭


为什么使用文件

在之前学习通讯录时,我们可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入。

所以我们想应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。

使用文件我们可以将数据直接存放在电脑的磁盘上,做到了数据的持久化。

什么是文件

在程序设计中,一般讲的文件有两种:程序文件、数据文件(从文件功能的角度来分类的) 。

程序文件

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

数据文件

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

以前我们处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。但是我们更多的时候是需要把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件。

文件名

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

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

例如:D:\Program Files \Tencent\WeChat

为了方便起见,文件标识常被称为文件名

文件的打开和关闭

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名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类型包含的内容不完全相同,但是大同小异。 

文件基本操作:

  1. 打开文件
  2. 读/写-操作文件
  3. 关闭文件

 一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

FILE* pf; //文件指针变量

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

也就是说,通过文件指针变量能够找到与它关联的文件。

 

 

打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

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

 fopen函数第一个参数为文件名(可以写成相对路径,也可以写绝对路径);第二个参数为文件的打开方式(读、写等等)。

打开方式必须用上双引号,即 "r","w","a".

"r": 读文件;打开文件、操作文件,该文件必须存在。

"w":写文件;创建一个新文件,如果同名的文件已经存在,则覆盖它。

相对路径 

#include <string.h>
#include <errno.h>
int main()
{FILE* pf = fopen("test.txt","r");if(pf == NULL){printf("%s\n",strerror(errno);return 1;}//...//读文件//关闭文件fclose(pf);pf = NULL;return 0
}

 

绝对路径

#include <string.h>
#include <errno.h>
int main()
{FILE* pf = fopen("C:\\Users\\Adminitrator\\Desktop\\test.txt","r");if(pf == NULL){printf("%s\n",strerror(errno);return 1;}//...//读文件//关闭文件fclose(pf);pf = NULL;return 0
}

end


学习自:比特鹏哥——C语言课程

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

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

相关文章

【弹力设计篇】聊聊灾备设计、异地多活设计

单机&集群架构 对于一个高可用系统来说&#xff0c;为了提升系统的稳定性&#xff0c;需要以下常用技术服务拆分、服务冗余、限流降级、高可用架构设计、高可用运维&#xff0c;而本篇主要详细介绍下&#xff0c;高可用架构设计。容灾备份以及同城多活&#xff0c;异地多活…

OpenCV实现高斯模糊加水印

# coding:utf-8 # Email: wangguisendonews.com # Time: 2023/4/21 10:07 # File: utils.pyimport cv2 import PIL from PIL import Image import numpy as np from watermarker.marker import add_mark, im_add_mark import matplotlib.pyplot as plt# PIL Image转换成OpenCV格…

Git使用详解

什么是 Git&#xff1f; Git 是一种分布式版本控制系统&#xff0c;它可以帮助开发者跟踪文件的变化、协作开发、管理代码库等。与集中式版本控制系统不同&#xff0c;Git 的每个工作副本都包含完整的项目历史&#xff0c;这使得在没有网络连接的情况下也能独立进行工作。Git 的…

C++中的主线程、子线程

在C中&#xff0c;线程是并发执行的最小单位。主线程&#xff08;main thread&#xff09;通常是一个程序开始执行时系统自动创建的线程&#xff0c;而子线程&#xff08;child thread或worker thread&#xff09;则是由主线程或其他子线程创建的线程。 并发执行&#xff0c;又…

ORBSLAM2第一阶段跟踪课后习题

不定项选择题 (2分) 阅读TrackReferenceKeyFrame()函数&#xff0c;以下说法[错误]的是? A.该函数是地图初始化完成后&#xff0c;第一个使用的跟踪方式 B.该函数中使用词袋&#xff0c;目的是可以加快当前顿与参考帧之间的特征点匹配速度C.BA优化中同时优化了位姿和地图点 D.…

kafka:消费者从指定时间的偏移开始消费(二)

我的前一篇博客《kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)》为了忽略忽略掉上线之前的所有消息&#xff0c;从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。 但这个方案需要使用不常用的AdminClient类&#xff0c;而且如果该主题如果是第…

Python的输入:探索不同的输入方法和技巧

Python的输入&#xff1a;探索不同的输入方法和技巧 引言 1.1 Python的输入概述 在编程中&#xff0c;输入是一个非常重要的概念。它允许我们从用户、文件或其他程序中获取数据&#xff0c;以便进行处理、计算或展示。Python提供了多种方法来获取输入&#xff0c;每种方法都…

SpringBoot中的RestTemplate使用笔记

SpringBoot中的RestTemplate使用笔记 为了方便使用&#xff0c;这里我封装成一个工具类来静态调用RestTemplate以下代码是基于SpringBoot2.4.2版本写的案例 需要配置的application.yml如下 server:port: 7024servlet:context-path: /demosession:timeout: 30m #默认会话过期…

redis分布式锁

Redis 作者继续论述&#xff0c;如果对方认为&#xff0c;发生网络延迟、进程 GC 是在步骤 3 之后&#xff0c;也就是客户端确认拿到了锁&#xff0c;去操作共享资源的途中发生了问题&#xff0c;导致锁失效&#xff0c;那这不止是 Redlock 的问题&#xff0c;任何其它锁服务例…

数据库面试题

Mysql篇 &#xff08;1&#xff09;请你解释下mysql主从同步中的&#xff0c;全同步&#xff0c;异步&#xff0c;以及半同步的三种模式概念? 此题是XX想面试题。 MySQL默认的复制即是异步的&#xff1a; 主库在执行完客户端提交的事务后会立即将结果返给客户端&#xff0c…

Flowable-任务-脚本任务

定义 脚本任务&#xff08;Script Task&#xff09;是一种自动执行的活动。当流程执行到达脚本任务时&#xff0c;会执行相应的 脚本&#xff0c;完毕后继续执行后继路线。脚本任务无须人为参与&#xff0c;可以通过定义脚本实现自定义的业务逻辑。 图形标记 脚本任务显示为…

数据结构基础:3.单链表的实现。

单链表的介绍和实现 一.基本概念1.基本结构2.结构体节点的定义&#xff1a; 二.功能接口的实现0.第一个节点&#xff1a;plist1打印链表2创建一个节点3.头插4.头删5.尾插6.尾删7.查找8.在pos之前插入x9.在pos之后插入x10.删除pos位置11.删除pos的后一个位置12.链表释放 三.整体…

UE4/5C++多线程插件制作(二十、源码)

目录 头文件 MultiThreadPlugins.uplugin MultiThreadPlugins.Build.cs MultiThreadPlugins.h MTPPlatform.h MTPManage.h RTPAgendy.h MTPThreadTaskManage.h

C语言每天一练----输出水仙花数

题目&#xff1a;请输出所有的"水仙花数" 题解&#xff1a;所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。 例如, 153是水仙花数, 因为153 1 * 1 * 1 5 * 5 * 5 3 * 3 * 3" #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h&g…

【自动化运维】Ansible常见模块的运用

目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1&#xff0e;command 模块3.2&#xff0e;shell 模块3.3&#xff0e;cron 模块3.4&#xff0e;user 模块3.5&#xff0e;group 模块3.6&#xff0e;copy 模块3.7&#xff0e;file 模块8&#xff…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU

早上百度搜“神经网络KPU”&#xff0c;查到与非网的一篇文章《一文读懂APU/BPU/CPU/DPU/EPU/FPU/GPU等处理器》&#xff0c;介绍各种处理器非常详细&#xff0c;关于“KPU”的内容如下&#xff1a; KPU Knowledge Processing Unit。 嘉楠耘智&#xff08;canaan&#xff09;号…

k8s证书更新,kubeadm安装的K8S证书过期后无法使用后证书更新方法

k8s证书更新 1. 查看证书过期时间 #通过文件查看证书过期时间 for item in find /etc/kubernetes/pki -maxdepth 2 -name "*.crt";do openssl x509 -in $item -text -noout| grep Not;echo $item;done #通过命令查看证书过期时间 kubeadm certs check-expirationk8…

找不到mfc140u.dll怎么解决

第一&#xff1a;mfc140u.dll有什么用途&#xff1f; mfc140u.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分。MFC是 C中的一个框架&#xff0c;用于构建Windows应用程序的用户界面和功能。mfc140u.dll包含了MFC库中…

杂谈项——关于我在bw上的见闻,以及个人对二次元游戏行业方面的前瞻

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天为大家带来一点不一样的&#xff0c;首先先光速叠一下甲&#xff1a; 在此说明博主并不是一个什么都知道的大佬&#xff0c;只是一个普通的老二次元以及期望以后能…

HCIP重发布实验

目录 实验要求&#xff1a; 步骤一&#xff1a;拓扑设计IP地址规划 拓扑设计 R1 R2 R3 R4 发布路由 R1 R2 R3 R4 双向重发布 在R2和R4 上进行 R2 R4 检查R1 修改开销值选路 择优选择去4.0网段的路径 测试&#xff1a;​编辑 择优选择去32网段的路径 测试&…