[C语言]-基础知识点梳理-文件管理
前言
- 各位师傅们好,我是qmx_07,今天给大家讲解文件管理的相关知识,也就是常见的 读取,删除一类的操作
文件
为什么要使用文件?
- 程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了
- 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化
文件分类
- 在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的
- 程序文件:包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)
- 数据⽂件:⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件
- 文件名:⽂件路径+⽂件名主⼲+⽂件后缀
文件的打开和关闭
文件指针
1.每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE
2.每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息, 使用者不必关心细节。
3.一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便
FILE* pf;//⽂件指针变量
- 定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件
文件的打开和关闭
- ⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
- ANSIC规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:
代码实例
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("C:\\Users\\ASUS\\Desktop\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读文件//关闭文件fclose(pf);pf = NULL;return 0;
}
文件的顺序读写
写字符
写字符函数:
int fputc ( const char * str, FILE * stream );
代码实例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//写文件fputc('a', pf);//关文件fclose(pf);pf = NULL;return 0;
}
查看目录内容:
读取字符
读取字符函数原型:
int fgetc ( const char * str, FILE * stream );
代码实例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//写文件int ch = fgetc( pf);printf("%c", ch);//关文件fclose(pf);pf = NULL;return 0;
}
- 返回类型为 int 以适应特殊值 EOF,这表示失败.基于此,我们可以循环输出:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//写文件int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c", ch);}printf("%c", ch);//关文件fclose(pf);pf = NULL;return 0;
}
写一行数据
函数原型:
int fputs ( const char * str, FILE * stream );
代码实例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//写文件fputs("hello", pf);//关文件fclose(pf);pf = NULL;return 0;
}
- “w"模式会覆盖文件内容,可以尝试使用"a”
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("test.txt", "a");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//写一行数据fputs("hello", pf);fclose(pf);pf = NULL;return 0;
}
读取一行数据
函数原型:
char * fgets ( char * str, int num, FILE * stream );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读取文件char arr[20];fgets(arr, 5,pf);printf("%s\n", arr);//关文件fclose(pf);pf = NULL;return 0;
}
- 读5个数据,真正读到的才4个,还有一个’\0’
格式化输出
函数原型:
int fprintf ( FILE * stream, const char * format, ... );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
struct S
{char arr[10];int age;float score;
};int main()
{struct S s = { "zhangsan",25,50.5f };FILE* pf = fopen("G:\\c_test\\test.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}fprintf(pf, "%s %d %f", s.arr, s.age, s.score);//关文件fclose(pf);pf = NULL;return 0;
}
格式化输入
函数原型:
int fscanf ( FILE * stream, const char * format, ... );
代码实例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
struct S
{char arr[10];int age;float score;
};int main()
{struct S s = { 0 };FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));printf("%s %d %f", s.arr, s.age, s.score);//关文件fclose(pf);pf = NULL;return 0;
}
二进制输出
函数原型:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
代码实例:
struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { "zhangsan",25,50.5f };//以二进制形式写到文件中FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//二进制的方式写fwrite(&s, sizeof(struct S), 1, pf);fclose(pf);pf = NULL;
}
二进制输入
函数原型:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>struct S
{char arr[10];int age;float score;
};
int main()
{struct S s = { 0};//以二进制形式写到文件中FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//二进制的方式读取fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f", s.arr, s.age, s.score);fclose(pf);pf = NULL;
}
文件随机读写
- 随机读写:不从首个位置开始,而可以选择任意位置
fseek
函数原型:
int fseek ( FILE * stream, long int offset, int origin );
文本内容:
代码实例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读文件//定位文件指针fseek(pf, 2, SEEK_SET);int ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读文件//定位文件指针fseek(pf, 2, SEEK_SET);int ch = fgetc(pf);printf("%c\n", ch);fseek(pf, 2, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}
- SEEK_CUR就是在当前位置,在进行跳转
ftell
函数原型:
long int ftell ( FILE * stream );
- 概念:返回文件指针相对于起始位置的偏移量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读文件//定位文件指针fseek(pf, 2, SEEK_SET);int ch = fgetc(pf);printf("%c\n", ch);printf("%d\n", ftell(pf));//3//fseek(pf, 2, SEEK_CUR);fseek(pf, -1, SEEK_END);ch = fgetc(pf);printf("%c\n", ch);printf("%d\n", ftell(pf));//6fclose(pf);pf = NULL;return 0;
}
rewind
函数原型:
void rewind ( FILE * stream );
- 概念:返回到文件起始位置
代码实例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{FILE* pf = fopen("G:\\c_test\\test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读文件//定位文件指针fseek(pf, 2, SEEK_SET);int ch = fgetc(pf);printf("%c\n", ch);rewind(pf);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}
文本文件和二进制文件
- 根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。
- 数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
- 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
- ⼀个数据在⽂件中是怎么存储的呢?
- 字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储
文件读取和结束的判定
-
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束
-
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets)
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL
- 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。例如:
fread判断返回值是否小于实际要读的个数。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{int c; // 注意:int,非char,要求处理EOFFILE* fp = fopen("test.txt", "r");if(!fp) {perror("File opening failed");return EXIT_FAILURE;}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环{putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}
文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
- 因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。如果不做,可能导致读写文件的问题。
相关文章:

[C语言]-基础知识点梳理-文件管理
前言 各位师傅们好,我是qmx_07,今天给大家讲解文件管理的相关知识,也就是常见的 读取,删除一类的操作 文件 为什么要使用文件? 程序的数据是存储在电脑的内存中,如果程序退出,内存回收&…...

pcdn闲置带宽被动收入必看教程。第五讲:光猫更换和基础设置
PCDN闲置带宽被动收入必看教程 —— 第五讲:光猫更换和基础设置 为了从闲置带宽中获得被动收入,高效的网络设备至关重要。运营商提供的光猫通常能满足日常家用需求,但对于PCDN应用来说,它们可能不足以提供所需的高性能和稳定性。…...

工业数据采集网关简介-天拓四方
随着工业4.0和物联网(IoT)技术的深入发展,工业数据采集网关作为连接现场设备与上层管理系统的关键节点,其在智能工厂中的作用愈发凸显。本文将深入探讨工业数据采集网关的功能、特点、应用场景及其实操性,以期为读者提…...

Java 调整字符串,验证码生成
package text7;public class ZiFanz {public static void main(String[] args) {//1.定义两个字符串String strA "abcde";String strB "deabc";//2.abcde->bcdea->cdeab->deabc旋转字符串//旋转并比较boolean result cheak(strA, strB);System…...

【专题】全球商用服务机器人市场研究(2023)报告合集PDF分享(附原数据表)
原文链接:https://tecdat.cn/?p37366 近年来,随着人工智能、物联网和自动化技术的不断进步,商用服务机器人行业迅速崛起,展现出广阔的发展前景。从最初的实验室研发到如今的规模化应用,商用服务机器人已逐渐成为各行…...

SQL UA注入 (injection 第十八关)
简介 SQL注入(SQL Injection)是一种常见的网络攻击方式,通过向SQL查询中插入恶意的SQL代码,攻击者可以操控数据库,SQL注入是一种代码注入攻击,其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&a…...

初阶数据结构之计数排序
非比较排序 计数排序 计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。 操作步骤: 1)统计相同元素出现次数 2)根据统计的结果将序列回收到原来的序列中 #include "CountSort.h" void Count(int* arr, int n)…...

【开端】记一次诡异的接口排查过程
一、绪论 最近碰到这么一个情况,接口请求超时。前提是两台服务器间的网络是畅通的,端口也是通,应用代码也是通。意思是在应用上,接口没有任何报错,能正常返回数据。客户端到服务端接口也能通,但是接收不到服…...

jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目
各位小伙伴们大家好呀,我是小金,本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目,之前没怎么搞过部署相关的,以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题,特写此篇࿰…...

第2章 C语言基础知识
第2章 C语言基础知识 1.printf()函数 在控制台输出数据,需要使用输出函数,C语言常用的输出函数为printf()。 printf()函数为格式化输出函数,其功能是按照用户指定的格式将数据输出到屏幕上。 printf(“格式控制字符串”,[输出列表]); 格式控…...

鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)
一、鹭鹰优化算法介绍 鹭鹰优化算法(Secretary Bird Optimization Algorithm, SBOA)是一种新型的元启发式算法,它于2024年4月由Youfa Fu等人提出,并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…...

MySQL基础练习题48-连续出现的数字
目录 题目 准备数据 分析数据 题目 找出所有至少连续出现三次的数字。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Logs (id int, num int)## 向表中插入数据 Truncate table Logs insert into Logs (id, num) values (1, 1) i…...

webrtc学习笔记2
音视频采集和播放 打开摄像头并将画面显示到页面 1. 初始化button、video控件 2. 绑定“打开摄像头”响应事件onOpenCamera 3. 如果要打开摄像头则点击 “打开摄像头”按钮,以触发onOpenCamera事件的调用 4. 当触发onOpenCamera调用时 a. 设置约束条件,…...

Simple RPC - 06 从零开始设计一个服务端(上)_注册中心的实现
文章目录 Pre核心内容服务端结构概述注册中心的实现1. 注册中心的架构2. 面向接口编程的设计3. 注册中心的接口设计4. SPI机制的应用 小结 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现…...
【深度学习】基于Transformers的大模型推理框架
本文旨在介绍基于transformers的decoder-only语言模型的推理框架。与开源推理框架不同的是: 本框架没有利用额外的开源推理仓库,仅基于huggingface,transformers,pytorch等原生工具进行推理,适合新手学习大模型推理流…...

电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!
你是否曾好奇那些键盘敲击背后的秘密?电脑监控不仅是守护企业安全的隐形盾牌,更是揭秘高效与合规的魔法镜!一键解锁安企神监控回放,就像打开时间宝盒,让过去的工作瞬间跃然眼前。无论是精彩瞬间还是潜在风险࿰…...

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)
文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布,2.0版本迎来第一个稳定版本,同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架,可以让你使用前端技术来构建桌面…...

deque容器
deque容器的基本概念 deque 是 C 标准库中的双端队列(double-ended queue)容器,提供了在两端进行插入和删除操作的功能。 deque与vector区别: vector对于头部的插入删除效率低,数据量越大效率越低。deque相对而言&am…...
Redis远程字典服务器(9)—— 类型补充
类型查询传送门:Understand Redis data types | Docs 一,stream类型 官方文档对于这个类型的解释是:streams是一个数据结构,它表现得像一个 “append-only log”,就是只能往后面添加,底层是字符串&#x…...

VMware虚拟机nat无法联通主机
VMware在nat模式下主机无法ping通虚拟机 原因: 虚拟机和对应的网卡不在一个网段 虚拟机开启了防火墙 解决方法: 首先判断虚拟机的网络ip是否和网卡在一个网段上 判断虚拟机使用的网卡 nat模式在VMware虚拟机中一般只有一个对应的网卡 如图笔者的nat网卡为VM…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...