C语言笔记23 •文件操作•
1.为什么要使用文件?
文件,顾名思义就是存储我们所写在电脑上的文本内容。如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件
2.什么是文件?
3.流和标准流
4.文件指针
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE. 具体的可以看以下解释
VS2013 编译环境提供的 stdio.h 头⽂件中有以下的⽂件类型(FILE)的声明:
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类型包含的内容不完全相同,但是大同小异。
FILE* pf; // ⽂件指针变量//使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量), 通过⽂件指针变量能够间接找到与它关联的⽂件。可以看下图所示:![]()
5.文件的打开方式
#include <stdio.h>//在txt文件里写入字符串
int main()
{FILE* pr = fopen(".\\test.txt", "w");if (pr == NULL){perror("fopen");return 1;}//写文件fputs("Hello!\n", pr);fputs("I am a boy.", pr);//关闭文件fclose(pr);pr = NULL;return 0;
} 6.文件的顺序读写函数介绍
fgetc:读取文件中单个字符,可以换行读取,用于“r” :
int fgetc ( FILE * stream );
fputc:将字符串中单个字符,写到文件中,每次只能写一个,可以hun'H'n,用于“w” :
int fputc ( int character, FILE * stream );
fgets:读取文件中字符串,写在数组中,不可以换行读取,用于“r” :
char * fgets ( char * str, int num, FILE * stream );
fputs:将字符串,写在文件中,用于“w” :
int fputs ( const char * str, FILE * stream );
fscanf:格式化输入函数,从文件中读取信息,存放到结构体的各个成员中,用于“r”
int fscanf ( FILE * stream, const char * format, ... );
fprintf:格式化输出函数,把结构体的信息写在文件里,用于“w”
int fprintf ( FILE * stream, const char * format, ... );
fread:读取二进制文件中的信息放在结构体中,用于"rb":
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
fwrite:以二进制形式写在文件中,用于"wb":
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
对应的代码看10.代码附录
7.⽂件的随机读写函数介绍
fseek : 根据⽂件指针的位置和偏移量来定位⽂件指针,来读取文件中的内容。int fseek ( FILE * stream, long int offset, int origin );fseek的第三个参数(int origin)有三种模式:
SEEK_SET 文件开头 SEEK_CUR 文件指针的当前位置 SEEK_END 文件末尾 ftell :返回⽂件指针相对于起始位置的偏移量long int ftell ( FILE * stream );rewind:让⽂件指针的位置回到⽂件的起始位置void rewind ( FILE * stream );对应的代码看 10.代码附录
8.文件读取结束的判定
feof:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
int feof ( FILE * stream );
在vs2022中feof遇到结束标志EOF/NULL返回1,没遇到返回0,但是如果文件为空文件的话,则返回0,这也是文件末尾,就不能及时检测。
ferror:判断文件读取过程中是否出现错误,与feof返回值相反 读取完毕 返回0 未读取完,返回1。
int ferror ( FILE * stream );
对应的代码看10.代码附录
9.文件缓冲区
ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 ,程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
10.代码附录
//1.在txt文件里写入字符串
int main()
{FILE* pr = fopen(".\\test.txt", "w");if (pr == NULL){perror("fopen");return 1;}//写文件fputs("Hello!\n", pr);fputs("I am a boy.", pr);//关闭文件fclose(pr);pr = NULL;return 0;
}
//2.从txt文件里读字符串
int main()
{FILE* pr = fopen(".\\test.txt", "r");if (pr == NULL){perror("fopen");return 1;}char str[20] = "xxxxxxxxx";//读文件fgets(str, 6, pr);printf("%s", str);//关闭文件fclose(pr);pr = NULL;return 0;
}
3.从键盘上读字符串 写在屏幕上
int main()
{char str[20] = "xxxxxxxxx";fgets(str, 20, stdin);//从键盘(标准输入流stdin)上读取字符串 //文本行输入函数fputs(str, stdout);将字符串写在屏幕(标准输出流stdout)上 //文本行输出函数return 0;
}
//4.把结构体的信息写在文件里
struct S
{char name[20];int age;float store;
};
int main()
{FILE* pr = fopen("test.txt", "w");if (pr == NULL){perror("fopen");return 1;}struct S s = { "zhangsan",20,88.2f };//写文件fprintf(pr,"%s %d %.1f",s.name,s.age,s.store);//格式化输出函数printf("%s %d %.1f", s.name, s.age, s.store);//关闭文件fclose(pr);pr = NULL;return 0;
}
//5.从文件中读取信息,存放到结构体的各个成员中
struct S
{char name[20];int age;float score;
};
int main()
{//打开文件FILE* pr = fopen("test.txt", "r");if (pr == NULL){perror("fopen");return 1;}struct S s = {0};//读文件fscanf(pr, "%s %d %f", s.name, &(s.age), &(s.score));//打印到屏幕上//printf("%s %d %.1f", s.name, s.age, s.score);fprintf(stdout,"%s %d %.1f", s.name, s.age, s.score);//关闭文件fclose(pr);pr = NULL;return 0;
}
//6.非文件操作函数 sscanf sprintf
struct S
{char name[20];int age;float score;
};
int main()
{char arr[100] = { 0 };struct S s = { "zhangnan",20,88.2f };sprintf(arr, "%s %d %.1f", s.name, s.age, s.score);//将结构体s中的各个成员数据转化为字符串存放在arr中printf("%s\n", arr);struct S t = {0};//创建结构体变量 t sscanf(arr, "%s %d %f", t.name, &(t.age), &(t.score));//将arr中的数据 提取为格式化数据 存放在结构体 t 中printf("%s %d %.1f", t.name, t.age, t.score);return 0;
}//7.以二进制形式写在文件中
struct S
{char name[20];int age;float store;
};
int main()
{//打开文件FILE* pr = fopen("test.txt", "wb");if (pr == NULL){perror("fopen");return 1;}struct S s = { "zhangsan",30,88.5f };//写文件fwrite(&s,sizeof(struct S),1,pr);//以二进制形式写在文件中printf("%s %d %.1f", s.name, s.age, s.store);//关闭文件fclose(pr);pr = NULL;return 0;
}//8.读取二进制的信息写在文件中
struct S
{char name[20];int age;float store;
};
int main()
{//打开文件struct S w = {0};FILE* pr = fopen("test.txt", "rb");if (pr == NULL){perror("fopen");return 1;}//读文件printf("%s %d %.1f\n", w.name, w.age, w.store);fread(&w, sizeof(struct S), 1, pr);//读取二进制文件中的信息写在结构体中Sleep(1000);//延迟1sprintf("%s %d %.1f", w.name, w.age, w.store);//关闭文件fclose(pr);pr = NULL;return 0;
}//9.文件的随机读写
int main()
{//打开文件FILE* pr = fopen("test.txt", "r");if (pr == NULL){perror("fopen");return 1;}//读文件int ch = 0;ch = fgetc(pr);printf("%c\n", ch);//ach = fgetc(pr);printf("%c\n", ch);//b//定位指针文件//fseek(pr, 4, SEEK_SET);//(文件开头)相对于起始位置的偏移量 //ch = fgetc(pr);//printf("%c\n", ch);//e//fseek(pr, 2, SEEK_CUR);//(文件指针的当前位置)相对于当前位置的偏移量 //ch = fgetc(pr);//printf("%c\n", ch);//efseek(pr, -2, SEEK_END);//(文件末尾位置)相对于当前位置的偏移量 ch = fgetc(pr);printf("%c\n", ch);//e printf("%d\n", ftell(pr));//输出文件指针相较于文件的起始位置的偏移量 abcdefrewind(pr);//将文件指针重新定位到文件的起始位置ch = fgetc(pr);printf("%c\n", ch);//关闭文件fclose(pr);pr = NULL;return 0;
}//10.拷贝文件将test.txt内容拷贝到 test1.txt
int main()
{//打开文件FILE* pr = fopen("test.txt", "r");if (pr == NULL){perror("fopen\n");return 1;}FILE* pr1 = fopen("test1.txt", "w");if (pr == NULL){perror("fopen");fclose(pr);pr = NULL;return 1;}//拷贝文件开始int ch = 0;while ((ch = fgetc(pr)) != EOF){fputc(ch, pr1);}//拷贝结束printf("拷贝结束\n");//关闭文件fclose(pr);pr = NULL;fclose(pr1);pr1 = NULL;return 0;
}//11.文件读取结束判断函数(feof 读取完毕 返回1 、未读取完 返回0)
int main()
{打开文件FILE* pr = fopen("test.txt", "r");if (pr == NULL){perror("fopen\n");return 1;} int ch = 0;ch = fgetc(pr);printf("%d\n", feof(pr)); //未读取完 返回0while ((ch = fgetc(pr)) != EOF){printf("%c\n",ch);printf("%d\n", feof(pr));//未读取完 返回0}printf("===================================\n");printf("%d\n", feof(pr)); //读取完毕 返回1判断是什么造成的文件读取结束if (feof(pr)) //读取完毕 返回1 未读取完 返回0{printf("feof:文件内容读取完\n");return 1;}else if (ferror(pr)) //与feof返回值相反 读取完毕 返回0 未读取完 返回1{printf("ferror:文件读取过程中出现错误\n");return -1;}关闭文件fclose(pr);pr = NULL;return 0;
}//12.文件缓冲区(文件拷贝查看缓冲区现象)
int main()
{FILE* p = fopen("test.txt", "w");fputs("abcdef", p);//将字符串 abcdef. 写入 p→test.txtprintf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(p);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)//注:fflush 在高版本的VS上不能使用了printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");Sleep(10000);fclose(p);//注:fclose在关闭文件的时候,也会刷新缓冲区p = NULL;return 0;
}
相关文章:
C语言笔记23 •文件操作•
1.为什么要使用文件? 文件,顾名思义就是存储我们所写在电脑上的文本内容。如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序&#x…...
新项目来了,JDK 17和JDK 21 该如何选择?
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …...
友顺科技(UTC)分立器件与集成IC产品选型和应用
友顺科技股份有限公司成立于1990年,是全球领先的集成电路与功率半导体厂商 ,集团总部位于台北,生产基地位于福州、厦门。 友顺科技具有完整模拟组件产品线,其中类比IC涵盖各种稳压器、PWM控制IC, 放大器、比较器、逻辑IC、Voltage Translato…...
并发与多线程:创建多个线程,数据共享
数据共享问题分析 1. 只读的数据:安全稳定的,不需要特殊处理; 2. 又读又写的数据:2个线程写,8个线程读,写不好程序会崩。 c11并发于多线程_2章_4节_哔哩哔哩_bilibili...
【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码
资源地址:Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 完整代码分析 同时销售量后1000的sku品类占比中(不畅销产品)如上,精品类产品占比第一,达到66.7%,其次是香化类产品&#…...
LightGBM 进行回归建模的流程
LightGBM 进行回归建模的流程 文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有…...
【Linux】多进程基础--信号
文章目录 信号常见信号信号定时函数 信号 发生事件时通过信号向进程进行通知,在软件层次上模拟中断,也叫软件中断,处理优先级较高对于前台进程可以通过特殊的字符发送信号,例如CtrlC即给当前进程发送一个SIGINT中断信号。kill命令…...
若依项目部署(Linux2.0)
解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 配置Java环境变量: vim /etc/profile 设置环境变量生效: source /etc/profile 查看一下jdk版本: java -version 解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz 防火墙设置: …...
python小练习03
1.绘制奥运五环旗 #奥运五环的绘制 import turtle as t t.pensize(3) t.speed(0) def draw_circles():i0while i <4:args [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个…...
【机器学习】机器学习在深度学习领域中的作用:半监督学习的视角
👀时空之门👀 🔍引言🎈半监督学习概述🚝机器学习在深度学习领域中的作用☘特征提取与表示学习🍀复杂任务建模❀结合半监督学习提升性能 🚀半监督学习在深度学习中的应用场景📕图像识…...
C#WPF数字大屏项目实战01--开发环境与项目创建
1、学习目标 -界面布局 ,- 模板调整,- 控件封装,- 图表,- 通信对接,- 动态更新 2、开发环境 开发工具:Visual Studio-2022-17.8.6-Community 运行时框架:.Net 6或Framework 4.5以上 UI框…...
python中字符串的各类方法
大小写转换方法 upper() 用于将字符串中的小写字母转为大写字母。 abcd.upper() # ABCD aBcD.upper() # ABCD lower() 用于将字符串中的大写字母转为小写字母。 ABCD.lower() # abcd aBcD.lower() # abcd capitalize() 用于将字符串的第一个字母变成大写࿰…...
DataGrip 数据库连接客户端
I DataGrip 安装 1.1安装 打开dmg镜像,将“DataGrip.app”拖入应用程序中; 1.2 Act 打开应用程序,点击试用模式启动软件,然后将“jetbrains-agent-latest”拖到任意位置,然后拖入,弹出对话框,点击“Rest…...
JS片段:生成 UUID
Hi,这里是松桑,每天学习一个 JS 片段,涨涨🧀!今天带来的是如何生成 UUID,UUID作为全局唯一标识,使用常见广泛,包括分布式系统、数据库主键、会话标识、消息队列、日志追踪等等。 什么…...
小学数学出题器-Word插件-大珩助手
Word大珩助手是一款功能丰富的Office Word插件,旨在提高用户在处理文档时的效率。它具有多种实用的功能,能够帮助用户轻松修改、优化和管理Word文件,从而打造出专业而精美的文档。 【新功能】小学数学出题器 1、实现了难度设定;…...
短剧平台源码:打造个性化娱乐体验的核心功能
在数字化媒体的浪潮中,短剧平台源码扮演着至关重要的角色,它不仅是构建短剧平台的技术基础,更是提供个性化娱乐体验的关键。本文将深入探讨短剧平台源码的核心功能,包括推荐短剧、本周热门/热播、个性化推荐、追剧功能、观看历史、…...
【MySQL】MySQL 图形化界面 - 使用说明(MySQL Workbench)
一、安装软件 Navicat,SQLyog 这些软件都不错,不过都需要收费,当然也有破解版。下面用 MySQL Workbench,它是官方提供的工具。 二、使用操作 这个软件本质是一个客户端,现在要让数据库能够远程登录。不过一般不会远程…...
Shell 编程之免交互
一、Here Document 语法格式: 命令 << 标记 ...... ...... 标记 1.用wc -l的命令统计输入的文字的行数 [rootlocalhost ~]# wc -l <<EOF > aaa > bbb > ccc > EOF 3 备注: 显示行数。 2.整体赋值给变量,通过ech…...
github有趣项目:Verilog在线仿真( DigitalJS+edaplayground)
DigitalJS https://github.com/tilk/digitaljs这个项目是一个用Javascript实现的数字电路模拟器。 它旨在模拟由硬件设计工具合成的电路 像 Yosys(这里是 Github 存储库),它有一个配套项目 yosys2digitaljs,它可以转换 Yosys 将文…...
性能测试学习-基本使用-元件组件介绍(二)
jmeter优点是:开源免费,小巧,丰富的学习资料和扩展组件 缺点是:1.不支持IP欺骗,分析和报表能力相对于LR欠缺精确度(以分钟为单位) 工具用户量分析报表IP欺骗费用体积扩展性Loadrunner多(万)精…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
