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

news2024/11/20 23:32:27

在这里插入图片描述

前言
本篇博客讲解对文件的操作,包括打开,关闭操作。在下篇博客将讲解文件的读写。


文章目录

  • 一、 什么是文件?
    • 1.1 用于存储数据
    • 1.2 文件类型
    • 1.3 文件名
    • 1.4 二进制文件和文本文件
  • 二、文件的打开和关闭
    • 2.1 流和标准流
    • 2.2 文件指针
    • 2.3文件的打开与关闭

一、 什么是文件?

1.1 用于存储数据

文件是计算机系统中用于存储数据的基本单位。它可以包含文本、图像、音频、视频等各种类型的信息。文件通常以某种特定的格式存储,这个格式决定了文件中数据的组织方式,以及如何解释和处理这些数据。


1.2 文件类型

在计算机编程和脚本语言中,通常会使用多种类型的文件。以下是一些常见的文件类型:

  • 源代码文件: 这些文件包含程序员编写的源代码,通常使用特定的编程语言编写。这些文件以不同的文件扩展名结尾,例如:
    C/C++源文件:.c /.cpp
    Java源文件:.java
    Python源文件:.py
  • 头文件: 在某些编程语言中,头文件包含了程序中使用的函数、变量和数据结构的声明。它们通常以特定的文件扩展名结尾,如:
    C/C++头文件:.h
  • 文本文件: 文本文件包含人类可读的文本信息,例如文档、日志文件、报告等。它们可以使用各种文本编辑器进行编辑和查看。
  • 二进制文件: 二进制文件包含非文本数据,例如图像、音频、视频、可执行文件等。这些文件不是人类可读的,而是由计算机程序进行解释和处理。

还有许多种文件类型,这里不再一一列举。


1.3 文件名

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

⽂件名包含3部分:⽂件路径+⽂件名主干+⽂件后缀
例如:c:\code\test.txt

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

1.4 二进制文件和文本文件

数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是文本文件
在这里插入图片描述


二、文件的打开和关闭

2.1 流和标准流

在计算机编程和操作系统中,**“流”(stream)是一种用于在程序之间传输数据的抽象概念。**流可以用于输入(读取数据)和输出(写入数据),它们通常表示为一个序列化的数据流,可以是字节、字符或其他数据单元的连续流。

有两种主要类型的流:输入流和输出流。此外,有一种特殊类型的流称为标准流,它用于在程序和操作系统之间进行标准输入和标准输出。

  1. 输入流: 用于从外部源(如文件、键盘、网络连接)读取数据到程序中,使程序能够处理这些数据。输入流通常是单向的,只允许从源读取数据。常见的输入流操作包括从文件中读取数据、从键盘读取用户输入。
  2. 输出流: 用于将程序中的数据写入到外部目标(如文件、屏幕、网络连接)中,以供其他程序或用户查看或使用。输出流通常也是单向 的,只允许向目标写入数据。常见的输出流操作包括将数据写入文件、在屏幕上显示信息。
  3. 标准流: 用于与操作系统进行交互。它包括三个标准流(在C语言中标准流i是默认打开的不需要显式打开或关闭它们):
    • stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。
    • stdout - 标准输出流,⼤多数的环境中输出至显示器界⾯。
    • stderr - 标准错误流,标准错误流通常用于显示程序执行期间的错误消息,而不是正常的输出。

2.2 文件指针

文件操作通常涉及到内存中的一个FILE结构体变量,该结构体用于存储有关打开文件的相关信息。这个FILE结构体类型是由C标准库(如 <stdio.h>)定义的。

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;//将struct _iobuf重命名为FILE
//以上是在C语言标准库中声明的,我们只需使用即可

FILE* pf1;//创建⽂件指针变量,pf是⼀个指向FILE类型数据的指针变量。

这些成员的确切定义和实现可能因操作系统和编译器的不同而有所不同。每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关心细节。在这里插入图片描述


2.3文件的打开与关闭

在读写文件时,需要先打开文件,然后进行读写,最后需要关闭文件
在打开和关闭文件时,需要用到两个函数fopenfclose

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );//filename是文件名,mode表示文件打开的模式

//关闭⽂件
int fclose ( FILE * stream );//stream是一个文件指针

文件打开模式, 如下:

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

示例:

/* fopen fclose example */
#include <stdio.h>
int main(){
	FILE* pFile;
	//打开⽂件
	pFile = fopen("myfile.txt", "w");//"w"表示只写
	//⽂件操作
	if (pFile != NULL){
		fputs("fopen example", pFile);
		//关闭⽂件
		fclose(pFile);
	}
	return 0;
}

在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

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

相关文章

软件测试行业痛点分析

做软件测试的同学们&#xff0c;你在平时的测试工作中有哪些困惑或困扰呢&#xff1f;你可以自行简单思考一下。下面我梳理一下&#xff0c;大家可以看看自己是不是也有如此的感受。 从测试整体角度分析&#xff1a; 第一个痛点是入门容易深入难。 很多人认为软件测试也就那么…

速冻品、预制菜商城小程序的作用有哪些

速冻品和预制菜也有很高的市场需求度&#xff0c;如外卖店、早餐速食快餐店等&#xff0c;可以大幅度降低人工操作时间及成本&#xff0c;除了产品批发外&#xff0c;比如速冻水饺等零售也有市场。 而随着预制菜/冷冻品深入市场&#xff0c;不少餐饮商家都会采购&#xff0c;对…

CV经典任务(二)目标检测 |单目标,多目标 非极大值抑制等

文章目录 1 目标检测1.1 单目标检测1.2 多目标检测3.2.1 阶段一 单像素点采样目标检测3.2.2 阶段二 多像素点采样目标检测3.2.3 阶段三 RNN3.2.4 阶段四 一阶段的目标检测 Yolo/SSD 1 目标检测 目标检测的重要任务是 目标定位&#xff1a;目标检测的首要任务是确定图像中对象…

(数组/字符串) 380. O(1) 时间插入、删除和获取随机元素 ——【Leetcode每日一题】

❓ 380. O(1) 时间插入、删除和获取随机元素 难度&#xff1a;中等 实现 RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#x…

私房菜外卖配送商城小程序的作用是什么

私房菜有自己的品牌&#xff0c;也更容易跑出连锁经营体系&#xff0c;由于餐饮行业主要服务本地同城客户&#xff0c;因此在实际经营中对商家来说&#xff0c;怎样实现引流获客、促进到店及转化复购很重要。 传统线下传单、朋友圈推广等方式比较低效&#xff0c;而线上入驻第…

Spring Cloud Gateway实战WebFlux解析请求体及抛出指定错误代码和信息

概述 基于Spring Cloud开发微服务时&#xff0c;使用Spring Cloud原生自带的Gateway作为网关&#xff0c;所有请求都需要经过网关服务转发。 为了防止恶意请求刷取数据&#xff0c;对于业务请求需要进行拦截&#xff0c;故而可在网关服务增加拦截过滤器。基于此&#xff0c;有…

uniapp 事件委托失败 获取不到dataset

问题&#xff1a; v-for 多个span ,绑定点击事件 代码:view里包着一个span, <view class"status-list" tap"search"><span class"status-item" v-for"(key,index) in statusList" :key"index" :data-key"k…

程序员大佬‍被没收三年工资105w?

程序员大佬&#x1f468;&#x1f3fb;‍&#x1f4bb;被没收三年工资105w&#xff1f; 我在CSDN搜了一些关键词并没有找到关于这个事件的信息&#xff0c;发这篇文章主要是想让更多的大佬关注一下这个事情的发展&#xff0c;因此就放了几个图片&#xff0c;具体的大佬们可以去…

【短文】怎么查看自己的Linux是哪个发行版本和哪个版本号

2023年9月29&#xff0c;周三晚上 首先去到etc目录 cd /etc 然后用如下命令查看所有文件 ls 找到类似“XXX-release”的文件 然后用如下命令查看这个文件 cat

NodeMCU ESP8266基于Arduino IDE的开发环境搭建(图文并茂)

文章目录 NodeMCU ESP8266基于Arduino IDE的开发环境搭建&#xff08;手把手教程&#xff09;软件下载官网地址百度云 安装IDE配置基础配置设置开发板 测试串口驱动下载测试用例 总结 NodeMCU ESP8266基于Arduino IDE的开发环境搭建&#xff08;手把手教程&#xff09; 软件下…

力扣每日一题(+日常水几道题)

每日一题1333. 餐厅过滤器 - 力扣&#xff08;LeetCode&#xff09; 简单的按规则排序,去除几个不满足的条件然后排序返回即可 #include<algorithm> class Solution { public:vector<int> filterRestaurants(vector<vector<int>>& restaurants, …

涉及多条件查询 使用mybatispluse的解决方法EasyCaptcha图形验证码工具

登录中遇到账号和密码去数据库中查询因为查询是多条件的 所以需要使用QueryWrapper中allEq 而allEq如何添加条件使用map 位于mybatisplus的条件构造器的使用 条件构造器 | MyBatis-Plus QueryWrapper<User> wrapper new QueryWrapper<>();Map<String, Object&g…

rust所有权

一、堆和栈 栈和堆都是程序运行时使用的内存&#xff0c;但是它们的结构不同。 1.栈 栈&#xff0c;英文是stack。是内存的一段区域。 栈是后进先出形式的。就像薯片桶&#xff0c;先放进去的一片只能后拿出来。 栈上存储的数据大小必须是已知且固定的。也就是说如果一个变量…

独立站引流,如何在Reddit进行营销推广?

Reddit是目前最被忽视却最具潜力的社交媒体营销平台之一&#xff0c;它相当于国内的百度贴吧&#xff0c;是美国最大的论坛&#xff0c;也是美国第五大网站&#xff0c;流量仅次于Google、Youtube、Facebook以及亚马逊。 如果会玩&#xff0c;Reddit也可以跟其他的社交媒体营销…

Ubuntu安装Oracle JDK

文章目录 下载JDK安装Oracle JDK验证安装 下载JDK Oracle JDK需要从Oracle的官方网站下载&#xff0c;访问Oracle的官方网站并下载所需版本的JDK。 https://www.oracle.com/java/technologies/downloads/#java17 安装Oracle JDK 2.1. 下载.tar.gz文件后&#xff0c;移动到适…

一、2023.9.27.C++基础.1

回答问题一定要有逻辑性&#xff0c;我将从 这个技术是什么&#xff1f; 为什么要有这个技术&#xff1f; 这个技术底层是怎么实现的&#xff1f; 这个技术的优点缺点&#xff1f; 这个技术所适合的使用场景&#xff1f; 以下五个方面来回答问题。 文章目录 一、C基础部分&…

自动化测试-友好的第三方库

目录 mock furl coverage deepdiff pandas jsonpath 自动化测试脚本开发中&#xff0c;总是会遇到各种数据处理&#xff0c;例如MOCK、URL处理、JSON数据处理、结果断言等&#xff0c;也会遇到所采用的测试框架不能满足当前需求&#xff0c;这些问题都需要我们自己动手解…

Element UI搭建首页导航和左侧菜单以及Mock.js和(组件通信)总线的运用

目录 前言 一、Mock.js简介及使用 1.Mock.js简介 1.1.什么是Mock.js 1.2.Mock.js的两大特性 1.3.Mock.js使用的优势 1.4.Mock.js的基本用法 1.5.Mock.js与前端框架的集成 2.Mock.js的使用 2.1安装Mock.js 2.2.引入mockjs 2.3.mockjs使用 2.3.1.定义测试数据文件 2…

多元异构、绿色节能,揭秘浪潮计算机基础技术研究与整机柜设计思路

出品 | CSDN 云计算 数字化转型、云计算 技术与应用的爆发&#xff0c;数据中心从传统 CPU 为核心&#xff0c;变为 CPU、GPU、ASIC、FPGA、DPU 等等多种硬件与芯片架构、多元算力并存的阶段。对于企业来说&#xff0c;数字化转型中算力就是生产力&#xff0c;底层算力底座可能…

可信执行环境(Tee)入门综述

SoK: Hardware-supported Trusted Execution Environments [ArXiv22] 摘要引言贡献 范围系统和威胁模型系统模型威胁模型共存飞地对手无特权软件对手系统软件对手启动对手外围对手结构对手侵入性对手 关于侧信道攻击的一点注记 VERIFIABLE LAUNCH信任根&#xff08;RTM&#xf…