C语言【文件操作】(1)

news2024/12/29 11:43:50

文章目录

  • 1.为什么使用文件
  • 2.文件是什么?
    • 2.1程序文件
    • 2.2数据文件
  • 3.二进制文件和文本文件
  • 4.文件的打开和关闭
    • 4.1流和标准流
      • 标准流
    • 4.2文件指针
    • 4.3文件的打开和关闭
  • 结语

1.为什么使用文件

很简单 长久的存储数据

如果没有文件,我们写程序所产生的数据是存储在电脑的内存中的,一但程序结束或退出,内存就会回收,数据就丢失了,等我们再次运行程序的时候,是找不到上次程序产生的数据的,如果末尾想要将数据进行长期的保存,那就可以使用文件。

2.文件是什么?

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

2.1程序文件

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

2.2数据文件

该类型文件的内容就不是程序,而是程序运行时所存入的数据,例如程序运行需要读取数据的文件,或输出产生并输出内容的文件。

该文章讨论的是数据函数

3.二进制文件和文本文件

根据数据的存储模式,数据文件由分为文本文件二进制文件

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

如果在输出上要求以ASCII码的形式存储,则需要在存储前进行转换。以ASCII字符的形式存储文件就是文件文件

那么一个数据是怎么存储在文件上的呢?

字符一律按照ASCII码的形式存储,数值形式的数据既可以用ASCII码形式存储,也可以用二进制的形式存储。

假设有个整数10000,如果以ASCII码的形式存储,就会占用磁盘中的5个字节,如果是以二进制存储,则只占用磁盘中的4个字节。
在这里插入图片描述

4.文件的打开和关闭

4.1流和标准流

我们在程序的数据需要输出到各种外部设备,也需要从各种外部设备中获取数据,不同设备的输入输出操作各不相同。
为了方便程序员对各种设备进行操作,我们就抽象出了流的概念,我们可以将流想象成流淌着数据的河。
C程序针对文件、画面、键盘等数据的输入输出都是通过流操作的。
一般情况下,我们想往流里写数据,或者往流里读取数据,都是要打开流,然后再进行操作。

标准流

那为什么我们从键盘输入数据、向屏幕输出数据时,并没有打开流这个操作呢?
那是因为C语言程序启动时,会自动打开三个流:

  • stdin-标准输入流:在大多数的环境下从键盘输入,scanf函数就是从标准输入流中读取数据。
  • stdout-标准输出流:在大多数环境下将数据输出到屏幕上,printf函数就是将数据输出到标准输出流上的。
  • stderr-标准错误流:在大多数环境下,将错误信息输出到屏幕上

就是因为默认打开了这三个流,所以我们在使用scanf、printf等函数就可以直接的进行输入输出操作。

stdin、stdout、stderr这三个流的类型都是FILE*,该类型通常被称为文件指针。
C语言就是通过FILE*的文件指针来维护流的各种操作的。

4.2文件指针

每个被使用的文件都在内存中开辟了一个对应的文件信息区,用来存放文件的相关信息(如文件名,文件状态和文件当前的位置)。这些信息都存放在一个结构体变量中,该结构体类型由系统声明为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;

但VS2022编译环境中已经不一样了:

    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件时,系统就会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,我们使用者并不需要关心其中的细节。

创建FILE*类型的指针变量:

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

将pf定义为一个FILE类型的指针变量,可以使pf指向某个文件的文件信息区(使一个结构体变量),通过该文件信息区中的信息就可以访问该文件。
也就是说,我们可以通过文件指针变量来间接找到与它关联的文件
如图:
在这里插入图片描述

4.3文件的打开和关闭

文件在读写之前要打开文件,使用结束后应该关闭文件(常识)。
在编写程序时,打开文件的同时会返回一个FILE*类型的指针,这也相当于建立了指针和文件的关系。
ANSI C规定了使用fopen函数来打开文件,使用fclose来关闭文件。

//打开文件
FILE *fopen( const char *filename, const char *mode );

//关闭文件
int fclose( FILE *stream );

如果fopen函数打开文件失败,会返回NULL

mode表示文文件的打开方式:

文件使用方式含义如果指定文件不存在
“r”(只读为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
“w”(只写)为了输出数据,打开⼀个⽂本⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+(读写)”为了读和写,打开⼀个⽂本⽂件出错
“w+(读写)”为了读和写,打开⼀个⽂本⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“a+(读写)”打开⼀个⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件
“rb+(读写)”为了读和写打开⼀个⼆进制⽂件出错
“wb+(读写)”为了读和写打开⼀个⼆进制⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“ab+(读写)”打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

实际代码:

int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		exit(1);//该函数的头文件为<stdlib.h>
	}

	//操作文件
	fputs("fopen example", pf);

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

	return 0;
}

运行前:在这里插入图片描述

运行后:
在这里插入图片描述

结语

最后感谢您能阅读完此片文章,如果有任何建议或纠正欢迎在评论区留言。如果您认为这篇文章对您有所收获,点一个小小的赞就是我创作的巨大动力,谢谢!!!

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

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

相关文章

【Docker】如何注册Hub账号并上传镜像到Hub仓库

一、创建Hub账户 浏览器访问&#xff1a;hub.docker.com 点击【Sign up】注册账号 输入【邮箱】【用户名】【密码】 ps&#xff1a;用户名要有字母数字&#xff1b;订阅不用勾选 点击【Sign up】注册即可 点击【Sign in】登录账号 输入【邮箱】【密码】 点击【Continue】登录 二…

OceanBase 轻量级数仓关键技术解读

码到三十五 &#xff1a; 个人主页 为了更好地聚合和治理跨域数据&#xff0c;帮助企业用较低的成本快速聚合分析&#xff0c;快速决策&#xff0c;不断的让企业积累的数据产生价值&#xff0c;从全域海量数据抓取&#xff0c;高性能流批处理&#xff0c;元数据血缘治理等等方面…

spring高级篇(八)

本篇对Spring MVC 的执行流程做一个简单总结 MVC执行流程总结 当浏览器发送一个请求&#xff0c;例如http://localhost:8080/hello&#xff0c;请求到达服务器后&#xff0c;一般会进行如下操作&#xff1a; 1、首先会经过DispatcherServlet&#xff0c;默认映射路径为 /&…

WAF防火墙可以给您解决什么问题?哪些情况下使用WAF最适合?

一、什么是WAF&#xff1f; Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a;WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执行一系列针对HTTP/H…

Vulnstack(一)

0x00 Preface 网上有很多关于 Vulnstack&#xff08;一&#xff09; 的优质文章&#xff0c;本篇文章仅用于记录笔者自身的学习过程。因能力有限&#xff0c;过程中多多少少存在不完善的地方或是未解决的问题&#xff0c;日后有机会会补充上。 内网渗透基础总结&#xff1a;手…

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL&#xff08;Access Control Lists&#xff09; 4.1.2.6 Watcher(事件…

网安笔记(纯兴趣,随缘更新)

对于千锋教育的网安课程的笔记 (一)虚拟机环境搭建 01虚拟机概述 传统运行模式:一台计算机同时只能运行一个操作系统 虚拟机运行架构: 1.寄生架构 &#xff08;实验环境、测试环境&#xff09; • 虚拟机作为应用软件安装在操作系统上 • 可以在此应用软件上安装多个操作系统…

AI终端设备的自动化分级

摘要&#xff1a; AI智体被定义为感知环境、做出决策和采取行动的人工实体。 受SAE&#xff08;汽车工程师学会&#xff09;自动驾驶6个级别的启发&#xff0c;AI智体也根据效用和强度进行分类&#xff0c;分为以下几个级别&#xff1a; L0——无AI&#xff0c;有工具&#xf…

Mac上的数字足迹助手,myTracks一键管理!

myTracks for Mac是一款在macOS系统上运行的强大且易于使用的GPS跟踪软件应用程序。它专为户外探险家、运动爱好者和旅行者设计&#xff0c;可以帮助用户轻松记录和管理GPS轨迹、航点和地理标记照片。 首先&#xff0c;myTracks具有出色的GPS轨迹记录功能。它能够从各种设备&a…

Linux课程机房虚拟机

Linux课程机房虚拟机 机房虚拟机&#xff08;默认不能联网的&#xff09;&#xff1a; 百度网盘&#xff1a;https://pan.baidu.com/s/1WqSvqB3Y7b_D4690CDBlJA?pwdaugc 123网盘&#xff1a;https://www.123pan.com/s/tQ0UVv-LiolA.html提取码:F4xm ‍ 联网使用说明&…

AI智能体|使用扣子Coze创建AI绘画助手

大家好&#xff0c;我是无界生长。 昨天我们分享了《AI智能体&#xff5c;使用扣子Coze创建AI绘画工作流》&#xff0c;今天分享下如何使用Coze&#xff08;扣子&#xff09;创建AI绘画助手&#xff0c;调用之前创建的绘画工作流。学会了的话&#xff0c;欢迎分享转发&#xff…

Qt模型视图代理之QTableView应用的简单介绍

往期回顾 Qt绘图与图形视图之绘制带三角形箭头的窗口的简单介绍-CSDN博客 Qt绘图与图形视图之Graphics View坐标系的简单介绍-CSDN博客 Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍-CSDN博客 Qt模型视图代理之QTableView应用的简单介绍 一、最终效果 二、设计思路 这里…

《LTC与铁三角∶从线索到回款-人民邮电》关于铁三角不错的论述

《LTC与铁三角∶从线索到回款-人民邮电》一书中&#xff0c;关于铁三角不错的论述&#xff0c;收藏之&#xff1a;客户责任人的角色定义及核心价值 AR 的核心价值定位主要体现在三个方面&#xff1a;客户关系、 客户满意度、竞争对手 “ 压制 ” 。 维护客户关系&#x…

汽车热辐射、热传导、热对流模拟加速老化太阳光模拟器系统

汽车整车结构复杂&#xff0c;材料种类繁多&#xff0c;在使用过程中会面临各种严酷气候环境的考验&#xff0c;不可避免会出现零部件材料老化、腐蚀等不良现象&#xff0c;从而影响汽车的外观、功能&#xff0c;甚至产生安全隐患。因此&#xff0c;分析汽车零部件材料老化腐蚀…

基于机器学习的网络流量识别分类

1.cicflowmeter的目录框架&#xff1a; 各部分具体代码 FlowMgr类&#xff1a; package cic.cs.unb.ca.flow;import cic.cs.unb.ca.Sys; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.time.LocalDate;public class FlowMgr {protected static final…

每日一博 - 闲聊架构设计中的多级缓存设计

文章目录 方法论概述客户端缓存应用层缓存服务层缓存缓存设计的注意事项总结 思维导图戳这里 方法论概述 从客户端到服务层&#xff0c;缓存的应用广泛而重要。通过合理的缓存设计&#xff0c;能够有效地提高系统的性能并降低延迟。 客户端缓存 在客户端层面&#xff0c;浏览…

代码学习录打卡Day13

1 滑动窗口最大值 使用单调队列&#xff0c;需要一个队列&#xff0c;这个队列呢&#xff0c;放进去窗口里的元素&#xff0c;然后随着窗口的移动&#xff0c;队列也一进一出&#xff0c;每次移动之后&#xff0c;队列告诉我们里面的最大值是什么。 class MyQueue { public:vo…

JavaEE 多线程详细讲解(1)

1.线程是什么 &#xff08;shift F6&#xff09;改类名 1.1.并发编程是什么 &#xff08;1&#xff09;当前的CPU&#xff0c;都是多核心CPU &#xff08;2&#xff09;需要一些特定的编程技巧&#xff0c;把要完成的仍无&#xff0c;拆解成多个部分&#xff0c;并且分别让…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数&#xff1f; 1、open函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、open函数的常见应用场…

【平时工作中的各种术语__持续更新~~~~】

中文&#xff1a; 1、jar包 JAR包&#xff08;Java Archive Package&#xff09;是一种将多个Java类文件以及与它们相关的元数据和资源&#xff08;如文本、图片等&#xff09;打包到一个单一文件中的归档工具。它基于ZIP文件格式。JAR文件主要用于分发和部署Java应用程序。J…