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多(万)精…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...
