C进阶-语言文件操作

本章重点:

什么是文件
文件名
文件类型
文件缓冲区
文件指针
文件的打开和关闭文件的顺序读写文件的随机读写文件结束的判定

 1.  什么是文件

磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件

 1.1 程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

 1.2 数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

 1.3 文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。

 2. 文件的打开和关闭

 2.1 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE. 例如,VS2008编译环境提供的 stdio.h头文件中有以下的文件类型申明:

struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;
};
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关

心细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文 件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。 

2.2 文件的打开与关闭

int main()
{//相对路径//绝对路径///Users/fan/Documents/c_study/c_test26/data.txt//打开文件FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pf == NULL){perror("fopen");return 1;}//读文件//关闭文件fclose(pf);pf = NULL;return 0;
}

 3. 文件的顺序读写

 3.1 顺序读写函数介绍

 

 

int main()
{//相对路径//绝对路径///Users/fan/Documents/c_study/c_test26/data.txt//打开文件FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","w");if (pf == NULL){perror("fopen");return 1;}//读文件//写文件// fputc('a',pf);// fputc('b',pf);// fputc('c',pf);int i = 0;for (i = 0; i < 26; i++){fputc('a'+i,pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}
int main()
{//相对路径//绝对路径///Users/fan/Documents/c_study/c_test26/data.txt//打开文件FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pf == NULL){perror("fopen");return 1;}//读文件int ch = fgetc(pf);printf("%c\n",ch);  //ach = fgetc(pf);printf("%c\n",ch); //bch = fgetc(pf);printf("%c\n",ch); //cch = fgetc(pf);printf("%c\n",ch);//d//写文件// fputc('a',pf);// fputc('b',pf);// fputc('c',pf);// int i = 0;// for (i = 0; i < 26; i++)// {//     fputc('a'+i,pf);// }//关闭文件fclose(pf);pf = NULL;return 0;
}
int main()
{//相对路径//绝对路径///Users/fan/Documents/c_study/c_test26/data.txt//打开文件FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pf == NULL){perror("fopen");return 1;}//读文件// int ch = fgetc(pf);// printf("%c\n",ch);  //a// ch = fgetc(pf);// printf("%c\n",ch); //b// ch = fgetc(pf);// printf("%c\n",ch); //c// ch = fgetc(pf);// printf("%c\n",ch);//d//写文件// fputc('a',pf);// fputc('b',pf);// fputc('c',pf);// int i = 0;// for (i = 0; i < 26; i++)// {//     fputc('a'+i,pf);// }// fputs("hello fan\n",pf);// fputs("hello fanfan\n",pf);//读文件 - 读一行char arr[10] = {0};fgets(arr,15,pf);printf("%s\n",arr);fgets(arr,15,pf);printf("%s\n",arr);//关闭文件fclose(pf);pf = NULL;return 0;
}
struct S
{int a;float s;
};int main()
{//相对路径//绝对路径///Users/fan/Documents/c_study/c_test26/data.txt//打开文件FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pf == NULL){perror("fopen");return 1;}//写文件//struct S s = {100,3.14f};//fprintf(pf,"%d %f",s.a,s.s);struct S s = {0};fscanf(pf,"%d %f",&(s.a),&(s.s));printf("%d %f",s.a,s.s);//关闭文件fclose(pf);pf = NULL;return 0;
}
struct S
{int a;float s;char str[10];
};int main()
{struct S s = {99, 6.18f, "bit"};//打开文件FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","wb");if (pf == NULL){perror("fopen");return 1;}//写文件fwrite(&s,sizeof(struct S),1,pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
int main()
{struct S s = {0};//打开文件FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","rb");if (pf == NULL){perror("fopen");return 1;}//读文件fread(&s,sizeof(struct S),1,pf);printf("%d %f %s\n",s.a,s.s,s.str);//关闭文件fclose(pf);pf = NULL;return 0;
}

 4. 文件的随机读写

 4.1 fseek

根据文件指针的位置和偏移量来定位文件指针。

int fseek ( FILE * stream, long int offset, int origin );

int main()
{FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pf == NULL){perror("fopen");return 1;}//读文件//定位文件指针到fint ch = fgetc(pf);printf("%c\n",ch);   //ach = fgetc(pf);printf("%c\n",ch);  //bch = fgetc(pf);printf("%c\n",ch);  //c ch = fgetc(pf);printf("%c\n",ch);  //dfseek(pf,-3,SEEK_END);ch = fgetc(pf);printf("%c\n",ch);//关闭文件fclose(pf);pf = NULL;return 0;
}

4.2 ftell

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

int main()
{FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pf == NULL){perror("fopen");return 1;}//读文件//定位文件指针到fint ch = fgetc(pf);printf("%c\n",ch);   //ach = fgetc(pf);printf("%c\n",ch);  //bch = fgetc(pf);printf("%c\n",ch);  //c ch = fgetc(pf);printf("%c\n",ch);  //d// fseek(pf,-3,SEEK_END);// ch = fgetc(pf);// printf("%c\n",ch);int pos = ftell(pf);printf("%d\n",pos); //4//关闭文件fclose(pf);pf = NULL;return 0;
}

4.3 rewind 

让文件指针的位置回到文件的起始位置

void rewind ( FILE * stream );

int main()
{FILE* pf = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pf == NULL){perror("fopen");return 1;}//读文件//定位文件指针到fint ch = fgetc(pf);printf("%c\n",ch);   //ach = fgetc(pf);printf("%c\n",ch);  //bch = fgetc(pf);printf("%c\n",ch);  //c ch = fgetc(pf);printf("%c\n",ch);  //d// fseek(pf,-3,SEEK_END);// ch = fgetc(pf);// printf("%c\n",ch);// int pos = ftell(pf);// printf("%d\n",pos); //4rewind(pf);  //回到起始位置ch = fgetc(pf);printf("%c\n",ch); //a//关闭文件fclose(pf);pf = NULL;return 0;
}

 5. 文本文件和二进制文件

6. 文件读取结束的判断  

6.1 被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

1. 文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)

例如:

fgetc判断是否为EOF.

fgets判断返回值是否为NULL.

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:

fread判断返回值是否小于实际要读的个数。

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);
}//拷贝文件
//拷贝data.txt文件,产生一个新文件data1.txtint main()
{FILE* pfRead = fopen("/Users/fan/Documents/c_study/c_test26/data.txt","r");if (pfRead == NULL){perror("open file for read");return 1;}FILE* pfWrite = fopen("/Users/fan/Documents/c_study/c_test26/data2.txt","w");if (pfWrite == NULL){perror("open file for write");fclose(pfRead);pfRead = NULL;return 1;}//读写文件int ch = 0;while((ch = fgetc(pfRead)) != EOF){fputc(ch,pfWrite);}//关闭文件fclose(pfRead);pfRead = NULL;fclose(pfWrite);pfWrite = NULL;return 0;
}

 7. 文件缓冲区

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

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

相关文章

安达发|制造企业生产排产现状和APS系统的解决方案

随着市场竞争的加剧&#xff0c;制造业企业面临着生产效率、成本控制和客户满意度等方面的巟大压力。在这种背景下&#xff0c;生产排产作为制造业的核心环节&#xff0c;对企业的生产经营具有重要意义。本文将针对制造业的生产排产现状进行分析&#xff0c;并提出相应的APS系统…

基于YOLOv5-7.0的PCB板缺陷检测

目录 参考引用一、数据集介绍二、环境配置三、构建训练数据集四、修改配置文件五、训练及tensorboard可视化六、效果测试七、遇到的BUG 参考引用 你的陈某某-基于YOLOv5的PCB板缺陷检测 一、数据集介绍 印刷电路板&#xff08;PCB&#xff09;瑕疵数据集。它是一个公共合成P…

有什么小程序可以下载视频号的视频?

​最近有一些朋友问我&#xff0c;【视频号下载助手】和【视频下载bot】小程序&#xff0c;有什么作用&#xff1f; 首先视频号下载助手是协助用户进行下载的&#xff0c;但由于下载要符合平台规定&#xff0c;我们就将视频下载助手与视频下载bot小程序想结合的模式&#xff0…

YOLO目标检测——红白细胞血小板数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红白细胞血小板计数和分类数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签&…

yxy销售网站后台管理系统

springbootmybatisthymeleaf 第一个练习的项目就是小商品零售平台后台管理系统&#xff0c;但是当时由于业务不熟练&#xff0c;需求分析先不做好&#xff0c;导致在开发的过程中出现了很多问题。 这次首先把需求确定&#xff0c;详细的做好前期准备工作&#xff0c;再来进行…

吴恩达开新课了:面向所有人的生成式 AI 课程!我已偷偷学了起来

作者 | 智商掉了一地 斯坦福大学的吴恩达教授可能是许多人接触 AI 的启蒙课导师吧&#xff0c;在过去的十多年中&#xff0c;他的《Machine Learning》课程已经对数百万的学习者产生了积极影响。 ▲image.png 而随着 ChatGPT 的推出&#xff0c;大模型和各类生成式人工智能&am…

你知道谁是计算机之父吗?

“计算机之父” 这个词通常用来指代计算机科学领域的杰出人物&#xff0c;他们在计算机科学和技术的发展中发挥了重要作用。有多位人物被认为是计算机之父&#xff0c;其中包括&#xff1a; 查尔斯巴贝奇&#xff08;Charles Babbage&#xff09;&#xff1a;是英国的一位杰出的…

博客后台模块续更(四)

八、博客后台模块-Excel表格 1. 接口分析 在分类管理中点击导出按钮可以把所有的分类导出到Excel文件 请求方式 请求地址 请求头 GET /content/category/export 需要token请求头 响应体&#xff1a; 直接导出一个Excel文件 失败的话响应体如下&#xff1a; {"c…

通过尖端技术创造价值:释放生成式 AI 的力量

塔曼纳 一、说明 近年来&#xff0c;世界见证了人工智能&#xff08;AI&#xff09;的重大进步&#xff0c;生成式AI是最具革命性的技术之一。生成式人工智能已成为一种强大的方法&#xff0c;使机器能够创建新的原创内容&#xff0c;使其成为不同行业各种应用背后的驱动力。在…

window系统如何管理多版本node

何时需要切换node版本 如果你正在维护一个旧项目&#xff0c;同时也在进行新项目&#xff0c;两个项目所依赖的node版本害不同&#xff0c;那么你可以就需要经常切换node版本。项目中可能依赖于某些npm包&#xff0c;而这些包对特定版本的Node有要求。需要满足这些要求以确保依…

隐式类型转换

什么是隐式类型转换&#xff0c;多参数的造函数隐式类型转换&#xff0c;和单参数的构造函数隐式类型转换有什么区别 C中有三种主要的隐式类型转换&#xff1a; 1:多参数的构造函数隐式类型转换 2:单参数的构造函数隐式类型转换 3:成员函数隐式类型转换。…

EasyCVR视频汇聚平台显示有视频流但无法播放是什么原因?该如何解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…

【试题032】C语言关系运算符例题

1.题目&#xff1a;设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为&#xff1f; 2.代码分析&#xff1a; //设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为?int a 2, b 4, c 5;printf("%d\n", (a b ! c > b > a));//分析&#xff…

element ui 中 el-button重新渲染后disabled属性失效

调试发现:disabled绑定的值和显示没有保持一致&#xff0c;发现是disabled属性失效 解决方式&#xff1a; 给标签添加key 比如&#xff1a;key“isOldVersion” <el-form-item><el-button type"primary" style"margin-left: 100px;" click"…

N-128基于springboot,vue酒店管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis 本系统功…

HarmonyOS 音视频开发概述

在音视频开发指导中&#xff0c;将介绍各种涉及音频、视频播放或录制功能场景的开发方式&#xff0c;指导开发者如何使用系统提供的音视频 API 实现对应功能。比如使用 TonePlayer 实现简单的提示音&#xff0c;当设备接收到新消息时&#xff0c;会发出短促的“滴滴”声&#x…

零基础新手也能会的H5邀请函制作教程

随着科技的的发展&#xff0c;H5邀请函已经成为了各种活动、婚礼、会议等场合的常见邀约方式。它们不仅可以提供动态、互动的体验&#xff0c;还能让邀请内容更加丰富多彩。下面&#xff0c;我们将通过乔拓云平台&#xff0c;带领大家一步步完成H5邀请函的制作。 1. 选择可靠的…

Leetcode 21 合并两个有序链表 (链表)

Leetcode 21 合并两个有序链表 &#xff08;链表&#xff09; 解法1 复杂的第一版本&#xff08;优化大于和等于合并见方法二&#xff09;解法2 注意注意&#xff1a;先添加元素toadd.next list1&#xff0c;添加之后才可以移动指针toadd toadd.next 解法1 复杂的第一版本&a…

【Java 进阶篇】深入了解 Bootstrap 按钮和图标

按钮和图标在网页设计中扮演着重要的角色&#xff0c;它们是用户与网站或应用程序交互的关键元素之一。Bootstrap 是一个流行的前端框架&#xff0c;提供了丰富的按钮样式和图标库&#xff0c;使开发者能够轻松创建吸引人的界面。在本文中&#xff0c;我们将深入探讨 Bootstrap…

【Python生活脚本】视频转Gif动图

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-20 ❤️❤️ 本篇更新记录 2023-10-20 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…