当前位置: 首页 > news >正文

一篇入门C语言【文件】

本科期间C语言的课本无论哪个版本都会有【文件】这一章节,不过好多学校基本上不讲或者就出一道选择题,讲得很浅,今天这篇详细总结一下这部分的知识~

一.原理解析

        文件是指存在在外部介质(如磁盘、磁带)上的数据集合。操作系统是以文件为单位对数据进行管理的~(这是408的常识。)

        程序执行时就称为进程,进程运行中的数据均存在内存中。需要存储运算后的数据时,就需要使用文件。这样程序下次启动后,就可以直接从文件中读取数据~

C语言对文件的处理方式如下:

  • 缓冲文件系统:系统自动在内存区为每一个正在使用的文件开辟一个缓冲区,用缓冲文件系统进行的输入、输出称为高级磁盘输入、输出。
  • 非缓冲文件系统:系统不自动开辟确定大学的缓冲区,而由程序为每个文件设定缓冲区,对应低级输入、输出。

缓冲区的原理:本质即为一段内存空间

  • 全缓冲:磁盘文件的读写操作
  • 行缓冲:遇到换行符才执行IO操作
  • 不带缓冲

(意义在于提高对文件的读写效率)

flie类型,看一下成员变量即可~ 

(不同系统和编译器的成员变量可能会有差异) 

我们通过文件指针来访问文件类型的变量~ 

二.文件打开及关闭

有关【流】的说法,指的就是指向文件的指针~

文件打开失败的情形:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r");if(fp==NULL){perror("fopen"); return -1; } return 0;
}

文件必须和可执行成程序在同一目录下:这样再执行上述代码就不会报错~

在文件中键入任意字符:

 通过fgetc可以获取第一个字符并输出:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r");char c;c=fgetc(fp);printf("%c",c); return 0;
}

用循环将文件中的字符全部输出:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r");char c;while((c=fgetc(fp))!=EOF)printf("%c",c); return 0;
}

修改代码,再向目标文件中写入“ABCDEFG”:(注意,权限要修改为“r+”,即允许写入)

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r+");char c;while((c=fgetc(fp))!=EOF)printf("%c",c); char i;for(i='A';i<='G';i++)c=fputc(i,fp);return 0;
}

博主已经执行了两次代码,如下图: (顺便提一句,r+是以文本的方式打开文件的~

由于文件指针是自移的,所以再执行一遍,上述字符会全部输出:

并且再度多一倍:

 (用Visual的话要分开读写操作!)

三.文件读写

上述两个只能操作一个字符,下面介绍批量操作的。

把之前file.txt里面的字符全部清空,然后执行下面的代码:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {char buf[32]="Jsl and Hyh~";FILE* fp;//file类型的指针int ret;//函数返回值 fp=fopen("file.txt","r+");ret=fwrite(buf,sizeof(char),12,fp);fclose(fp); }

字符写入文件:

需要注意一个细节,由于windows的设计,各位在以文本方式写入后,必须以文本方式读出,不然可能会有字节上的些许差异:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {//	char buf[32]="Jsl and Hyh~";FILE* fp;//file类型的指针int ret;//函数返回值 fp=fopen("file.txt","r+");
//	
//	ret=fwrite(buf,sizeof(char),12,fp);char buf1[32]={0};ret=fread(buf1,sizeof(char),32,fp);printf("%s",buf1); fclose(fp); }

 

 fgets和fputs同理,不过只能用于文本文件~

四.位置指针偏移

人工控制位置指针的方式:

代码如下:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {char buf[32]="Jsl and Hyh~";FILE* fp;//file类型的指针int ret;//函数返回值 int pos;fp=fopen("file.txt","r+");fwrite(buf,sizeof(char),12,fp);//写完以后无法直接读取字符串ret=fseek(fp,-5,SEEK_CUR); pos=ftell(fp);char buf1[32]={0};fread(buf1,sizeof(char),32,fp);printf("%s",buf1);fclose(fp); }

非常完美!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AMP网站的SEO 关于“备用网页”应该如何处理?
  • 鸿蒙模拟器篇
  • 地产行业如何利用Java实现精准营销
  • Winform -- ​c#:SynchronizationContext
  • vue3+ts封装一个uniapp的自动滚动列表,实现看板效果
  • 国内超声波清洗机哪个品牌好?质量好的超声波清洗机推荐
  • 026集——在旧式编码与 Unicode 之间转换(C# 编程指南)——C#学习笔记
  • 【算法】C++贪心算法解题(单调递增数字、坏了的计算器、合并区间)
  • PostgreSQL 中的 `generate_series` 函数使用
  • MAT:一款针对MSSQL服务器的安全检测与审计工具
  • 【C++】C++智能指针详解
  • VUE3 使用 <transition> 实现组件切换的过渡效果
  • 【日常记录-Linux】WebDriver
  • 如何打造抗冲击的超级电容器?用啥材料好?
  • 大数据技术概述
  • crontab执行失败的多种原因
  • iOS 系统授权开发
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • nginx 配置多 域名 + 多 https
  • webpack+react项目初体验——记录我的webpack环境配置
  • 前端之Sass/Scss实战笔记
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 由插件封装引出的一丢丢思考
  • MPAndroidChart 教程:Y轴 YAxis
  • ​520就是要宠粉,你的心头书我买单
  • ​Redis 实现计数器和限速器的
  • ​数据链路层——流量控制可靠传输机制 ​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #define、const、typedef的差别
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)大型网站架构演变和知识体系
  • .net 按比例显示图片的缩略图
  • .NET 给NuGet包添加Readme
  • .NET的微型Web框架 Nancy
  • .NET企业级应用架构设计系列之应用服务器
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • @Transactional 竟也能解决分布式事务?
  • [ 物联网 ]拟合模型解决传感器数据获取中数据与实际值的误差的补偿方法
  • [@Controller]4 详解@ModelAttribute
  • [14]内置对象
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [BSGS算法]纯水斐波那契数列
  • [C++]多态
  • [C++进阶篇]STL中vector的使用
  • [HackMyVM]靶场 VivifyTech
  • [HDCTF 2023]Welcome To HDCTF 2023
  • [Hdp] lc552. 学生出勤记录 II(dp+递推+状态定义+状态转移+向前转移+好题)
  • [HDU 3555] Bomb [数位DP]
  • [ITIL学习笔记]之事件管理(2)
  • [LeetCode] NO. 169 Majority Element
  • [mongodb][配置]MongoDB中限制内存