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

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. 文件缓冲区

相关文章:

C进阶-语言文件操作

本章重点&#xff1a; 什么是文件 文件名 文件类型 文件缓冲区 文件指针 文件的打开和关闭文件的顺序读写文件的随机读写文件结束的判定 1. 什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件 1.1 程序文件…...

17-spring aop调用过程概述

文章目录 1.源码2. debug过程1.源码 public class TestAop {public static void main(String[] args) throws Exception {saveGeneratedCGlibProxyFiles(System.getProperty("user.dir") + "/proxy");ApplicationContext ac = new ClassPathXmlApplicatio…...

微信小程序------框架

目录 视图层 WXML 数据绑定 列表渲染 条件渲染 模板 wsx事件 逻辑层 生命周期 跳转 视图层 WXML WXML&#xff08;WeiXin Markup Language&#xff09;是框架设计的一套标签语言&#xff0c;结合基础组件、事件系统&#xff0c;可以构建出页面的结构。 先在我们的项目中…...

Cross-Modal Joint Embedding with Diverse Semantics

计算两个嵌入之间的相似度得分&#xff0c;然后利用损失函数进行联合嵌入损失最小化优化并更新参数 辅助信息 作者未提供代码...

工具 | macOS 最简方式安装 adb 工具 | Mac

工具 | macOS 最简方式安装 adb 工具 | Mac 介绍 ADB&#xff08;Android Debug Bridge&#xff09;是 Android开发工具包&#xff08;SDK&#xff09;中的一项实用工具&#xff0c;用于与 Android 设备进行通信和调试。 在 macOS 操作系统上安装 ADB 环境可以帮助开发人员与…...

linux进阶(脚本编程/软件安装/进程进阶/系统相关)

一般市第二种,以bash进程执行 shelle脚本编程 env环境变量 set查看所有变量 read设置变量值 echo用于控制台输出 类似java中的sout declear/typeset声明类型 范例 test用于测试表达式 if/else case while for 函数 脚本示例 软件安装及进阶 fork函数(复制一个进程(开启一个进…...

谷歌云:下一代开发者和企业解决方案的强力竞争者

自从2018年Oracle前研发总裁Thomas Kurian加入谷歌云&#xff08;Google Cloud&#xff09;并出任谷歌云CEO以来&#xff0c;业界对于谷歌云的发展就十分好奇。而谷歌云的前任CEO Diane Greene曾是VMware的创始人之一&#xff0c;那么两任企业级技术和解决方案出身的CEO&#x…...

任务分配问题(回溯法)

算法设计 问题描述 有n&#xff08;n≥1&#xff09;个任务需要分配给n个人执行&#xff0c;每个任务只能分配给一个人&#xff0c;每个人只能执行一个任务。 第i个人执行第j个任务的成本是c[i][j]&#xff08;1≤i&#xff0c;j≤n&#xff09;。求出总成本最小的分配方案 …...

华为OD 字符串消除(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

索引背后的数据结构——B+树

为什么要使用B树&#xff1f; 可以进行数据查询的数据结构有二叉搜索树、哈希表等。对于前者来说&#xff0c;树的高度越高&#xff0c;进行查询比较的时候访问磁盘的次数就越多。而后者只有在数据等于key值的时候才能进行查询&#xff0c;不能进行模糊匹配。所以出现了B树来解…...

面试用-常用注解

Configuration 注意由ConfigurationClassPostProcessor来处理ConfigurationClassPostProcessor执行这个后置处理 ConfigurationClassParser.parse执行这个方法里面会解析很多注解。1、Component 对于Component也是一样递归调用parse方法&#xff0c;一层层解析…...

【c++】跟webrtc学std array 4: H264PacketBuffer 包缓存

H264PacketBuffer m98代码:H264PacketBuffer 类似于PacketBuffer ,但仅用于H264// The H264PacketBuffer does the same job as the PacketBuffer but for H264 // only. To make it fit in with surronding code the PacketBuffer input/output // classes are used. 因此,…...

Nodejs Web数据库应用演示实例

Nodejs Web应用基础演示实例 Web数据库应用 一、服务器端 var express require(express); var app express(); var mysql require(mysql);//设置静态资源目录public app.use(express.static(__dirname /public));//创建mysql数据库访问连接&#xff08;数据库主机地址&a…...

Vue 中setup的特性

特性四&#xff1a;父传子组件传参【defineProps】&#xff1a; 父组件&#xff08;传递数据&#xff09;&#xff1a;利用自定义属性传递数据。 <template><h3>我是父组件</h3><hr /><Child :name"info.name" :age"info.age"…...

Peter算法小课堂—正整数拆分

大家可能会想&#xff1a;正整数拆分谁不会啊&#xff0c;2年级就会了&#xff0c;为啥要学啊 例题 正整数拆分有好几种&#xff0c;这里我们列举两种讲。 关系 我们看着第一幅图&#xff0c;头向左转90&#xff0c;记住你看到的图&#xff0c;再来看第二幅图&#xff0c;你…...

EDUSRC--简单打穿某985之旅

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…...

vue2升级到vue2.7

vue2升级到vue2.7 小小的改进,大大的提升 只需要简单修改,开发体验得到大大提升. 为什么要升级Vue2.7 不能拒绝的理由: 组合式 API(解决mixins问题:命名冲突,隐式依赖)单文件组件内的 <script setup>语法模板表达式中支持 ESNext 语法(可选链:?.、空值合并:??)单文…...

【django2.0之Rest_Framework框架一】rest_framework序列器介绍

Django RestFramework(简称DRF) 提供了序列化器Serialzier的定义&#xff0c;可以帮助我们简化序列化与反序列化的过程&#xff0c;不仅如此&#xff0c;还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文…...

Mock 测试详解:什么是 Mock 测试

Mock测试 什么是 Mock &#xff1f; Mock 的意思就是&#xff0c;当你很难拿到源数据时&#xff0c;你可以使用某些手段&#xff0c;去获取到跟源数据相似的假数据&#xff0c;拿着这些假数据&#xff0c;前端可以先行开发&#xff0c;而不需要等待后端给了数据后再开发。 Mo…...

Android端自定义铃声

随着移动应用竞争进入红海时代&#xff0c;如何在APP推送中别出心裁显得尤为重要。例如对自己的APP推送赋予独特的推送铃声&#xff0c;能够给用户更加理想的使用体验。 1、个性化提醒铃声有助于当收到特定类型的消息时&#xff0c;用户能够立刻识别出来。 2、不同的推送铃声…...

XLeRobot终极指南:如何用660美元打造你的家庭双手机器人

XLeRobot终极指南&#xff1a;如何用660美元打造你的家庭双手机器人 【免费下载链接】XLeRobot XLeRobot: Practical Dual-Arm Mobile Home Robot for $660 项目地址: https://gitcode.com/GitHub_Trending/xl/XLeRobot 还在为昂贵的机器人平台望而却步&#xff1f;XLeR…...

Go语言变量与数据类型完全指南

概述Go语言以其简洁的类型系统著称&#xff0c;变量声明方式多样&#xff0c;数据类型清晰明了。本文详细介绍Go语言中的变量声明、基本数据类型、类型转换以及可见性规则&#xff0c;帮助读者打下坚实的类型基础。一、变量声明1.1 var 声明标准的变量声明使用 var 关键字&…...

2026年Hermes Agent/OpenClaw怎么部署?新手部署及token Plan配置详解

2026年Hermes Agent/OpenClaw怎么部署&#xff1f;新手部署及token Plan配置详解。OpenClaw&#xff08;前身为Clawdbot/Moltbot&#xff09;作为开源、本地优先的AI助理框架&#xff0c;凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力&#xff0c;成为个人办公…...

springboot和Vue3的体育馆场地预约管理系统的设计与实现

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分技术栈组合数据库设计要点安全防护措施扩展性设计部署方案项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 后端&…...

画图工具推荐:绘制架构图、流程图

画图工具推荐&#xff1a;绘制架构图、流程图在数字化协作时代&#xff0c;绘制清晰的架构图和流程图是程序员、产品经理和设计师的必备技能。无论是梳理系统逻辑、规划业务流程&#xff0c;还是向团队传递设计思路&#xff0c;一款高效的工具能事半功倍。本文将推荐几款实用工…...

Dream-Creator:基于Stable Diffusion的本地AI图像生成工作站部署与实战

1. 项目概述&#xff1a;一个面向未来的AI图像生成工具最近在GitHub上闲逛&#xff0c;发现了一个名为“Dream-Creator”的项目&#xff0c;作者是Xianyu33666。这个项目名本身就挺有意思的&#xff0c;“梦想创造者”&#xff0c;听起来就充满了想象力。点进去一看&#xff0c…...

Space Thumbnails:Windows资源管理器3D模型预览终极指南

Space Thumbnails&#xff1a;Windows资源管理器3D模型预览终极指南 【免费下载链接】space-thumbnails Generates preview thumbnails for 3D model files. Provide a Windows Explorer extensions that adds preview thumbnails for 3D model files. 项目地址: https://git…...

别再瞎学AI了!这张路线图,帮你从入门到落地,少走90% 的弯路

AI时代的红利&#xff0c;从来不属于 “跟风学” 的人。有人学了半年 Python&#xff0c;还是只会写 “Hello World”&#xff1b;有人刷了一堆算法课&#xff0c;面试时连项目都拿不出手&#xff1b;有人跟风报了 LLM 班&#xff0c;学完依然不知道怎么把模型部署到服务器上……...

如何5分钟快速部署GreaterWMS:终极开源仓库管理系统指南

如何5分钟快速部署GreaterWMS&#xff1a;终极开源仓库管理系统指南 【免费下载链接】GreaterWMS This Inventory management system is the currently Ford Asia Pacific after-sales logistics warehousing supply chain process . After I leave Ford , I start this projec…...

碧蓝航线Alas自动化脚本:告别重复劳动的全托管解决方案

碧蓝航线Alas自动化脚本&#xff1a;告别重复劳动的全托管解决方案 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为每…...