文件操作详解

news2025/1/11 19:43:38

文章目录

  • 前言
  • 一、什么是文件?
    • 1.程序文件
    • 2.数据文件
    • 3.文件名
  • 二、文件的打开和关闭
    • 1.文件指针
    • 2.文件的打开和关闭
    • 3.打开模式汇总
    • 4.例子
  • 三.操作函数介绍
    • 1.基本函数
    • 2.fseek
    • 2.ftell
    • 3.rewind
    • 4.feof
  • 尾话


前言

在这里插入图片描述


恐怕很多人学完了c语言甚至不知道文件操作,也确实,很多人觉得这部分的知识确实鸡肋(其实我也觉得鸡肋,嘻嘻),但是虽然用处不大但是我们应该知道,我这里介绍操作函数

一、什么是文件?

1.程序文件

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

2.数据文件

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

当然,我下面讨论的都是数据文件的操作

3.文件名

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

那么我们怎么使用文件了,那我接下来就来介绍

二、文件的打开和关闭

1.文件指针

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

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

当文件被打开时,文件的数据就会放在这个结构体当中,当然,这也是用来理解的,不理解也没关系

2.文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件,这是一个好习惯

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );

3.打开模式汇总

在这里插入图片描述

4.例子

int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//关闭文件
		fclose(pFile);
	}
	return 0;
}

运行过后
在这里插入图片描述
在这里插入图片描述

w模式下,我们可以看到文件自动生成了,并且打印了
在这里插入图片描述
同时,里面也有了打印的字

三.操作函数介绍

1.基本函数

在这里插入图片描述

这里我只讲fgetc函数,因为其有一点特殊
fgetc函数会在运行后使得文件指针向后偏移一位

2.fseek

int fseek( FILE *stream, long offset, int origin );
根据文件指针的位置和偏移量来定位文件指针
origin是起始位置,offset是偏移量,正数时向右偏移,负数时向左偏移
在这里插入图片描述
cur是当前位置,end是文件末尾,set是开头

int main ()
{
FILE * pFile;
pFile = fopen ( "example.txt" , "wb" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}

2.ftell

long int ftell ( FILE * stream );
返回文件指针相对于起始位置的偏移量

int main ()
{
FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return 0;
}

3.rewind

void rewind ( FILE * stream );
让文件指针的位置回到文件的起始位置
相当于fseek用set的0偏移量

int main ()
{
int n;
FILE * pFile;
char buffer [27];
pFile = fopen ("myfile.txt","w+");
for ( n='A' ; n<='Z' ; n++)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]='\0';
puts (buffer);

4.feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

  1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
    例如:
    fgetc 判断是否为 EOF .
    fgets 判断返回值是否为 NULL .
  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数
int main(void)
{
int c; // 注意:int,非char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((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);
}

尾话

这篇文章算是结束了,写的有点不好,担待一下,谢谢

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

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

相关文章

FPGA学习笔记-知识点3-Verilog语法1

1.关键字 2.运算符 按其功能可分为以下几类: 1) 算术运算符(,&#xff0d;,&#xff0c;/,&#xff05;) 2) 赋值运算符(,<) 3) 关系运算符(>,<,>,<) 4) 逻辑运算符(&&,||,!) 5) 条件运算符( ? &#xff1a;) 6) 位运算符(,|,^,&,^) …

【微信小程序】动态设置导航栏标题

&#x1f3c6;今日学习目标&#xff1a;第十八期——动态设置导航栏标题 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;25分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录前言使用配置文件…

消息中间件简介

UNIX的进程间通信就开始运用消息队列技术&#xff0c;一个进程将数据写入某个特定的队列中&#xff0c;其它进程可以读取队列中的数据&#xff0c;从而实现异步通信。对于如今的分布式系统&#xff0c;消息队列已经演变为独立的消息中间件产品&#xff0c;相比于RPC同步通信的方…

设计模式_行为型模式 -《模板方法模式》

设计模式_行为型模式 -《模板方法模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都…

测试开发 | AppCrawler 自动遍历测试实践(三):动手实操与常见问题汇总

上两篇文章介绍了自动遍历的测试需求、工具选择和 AppCrawler 的环境安装、启动及配置文件字段基本含义&#xff0c;这里将以实际案例更加细致的说明配置文件的用法和一些特殊场景的处理。 实操演示 常规使用 下面我们继续之前的例子&#xff0c;在雪球搜索框输入搜索内容后的页…

代码随想录算法训练营第六天 | 哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集, 202. 快乐数,1. 两数之和

第五天 周日 休息~【提醒补坑&#xff1a;链表总结还没写】一、参考资料哈希表理论基础文章连接&#xff1a;https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html有效的字母异位词题目链接/文章讲解/视频讲解&#xff1a;https:…

使用批处理__更改ip

1、使用.bat进行处理 echo off rem 测试更改ip netsh int ip set address "以太网 2" static 10.10.2.1 255.255.255.0 10.10.2.254 1 pause&exit 备注其他 echo #设静态IP netsh interface ip set address name"本地连接" sourcestatic addr192.16…

大坝安全监测解决方案 水库大坝安全监测系统改造工程方案

平升电子大坝安全监测系统根据SL551-2012《土石坝安全监测技术规范》的整编要求&#xff0c;设置了变形监测、渗流监测、环境量监测。借助大坝安全监测系统可及时了解大坝的工作性态和水库可能存在的事故隐患&#xff0c;为大坝安全管理与水库运行调度提供了准确、及时的现场信…

ElasticSearch7.10配置Search-Guard之配置用户

ElasticSearch7.10配置Search-Guard之配置用户 配置sg_internal_user.yml 密码是&#xff1a;elastic jode:hash: $2y$12$nUzkcjdnufzvI1HlmN7xSuND3skGhmwV5le5IINejz.asMFpLYNRybackend_roles:- "hr_department"psmith:hash: $2y$12$nUzkcjdnufzvI1HlmN7xSuND3sk…

[标准库]STM32F103R8T6 标准库配置RCC时钟和超频

前言 这篇博客总结一下学习到的配置时钟的方法。 从启动文件来看&#xff0c;MCU复位之后&#xff0c;执行到SystemInit()这个函数之后&#xff0c;会进入系统初始化设置&#xff0c;比如根据当前的MCU型号进入不同的条件编译语句&#xff0c;再配置相应的寄存器初始值&#…

mysql之一条mysql语句时如何执行的

请把连接器的功能说明一下? 连接器负责建立客户端和mysql服务器之间的连接.当客户端在中断输入连接命令(mysql -h -u -p),传输层使用tcp协议,通过三次握手建立连接. 如果mysql服务服务没有启动,会报错: 如果mysql服务正常启动,完成三次握手,在传输层建立连接后,会进行密码验证…

【云原生】k8s 一键部署(ansible)

文章目录一、概述二、Ansible 部署1&#xff09;开启记录日志2&#xff09;去掉第一次连接ssh ask确认3&#xff09;配置hosts三、开始编排 ansible playbook1&#xff09;创建目录2&#xff09;节点初始化3&#xff09;安装 docker4&#xff09;安装 k8s 相关组件5&#xff09…

2022 年 12 月区块链操作系统的开发回顾

正在寻找区块链操作系统组件的最新进展&#xff1f;你找对地方了&#xff01;正如在我们的路线图文章中所描述的那样&#xff0c;我们一直在朝着定期且频繁的更新方向发展着&#xff0c;以便让我们的社区能够及时的了解到我们取得的进展&#xff0c;以及将区块链操作系统提升到…

新年喜报 再添殊荣 加速科技荣获浙江省“专精特新”企业认定

新年伊始&#xff0c;杭州市经济和信息化局公布了2022年度浙江省专精特企业名单。杭州加速科技有限公司&#xff08;以下简称“加速科技”&#xff09;凭借在技术创新、产品研发、精细化程度、经营能力、拓展潜力等多方面的优势&#xff0c;荣获浙江省“专精特新”企业荣誉称号…

一个人,一座城,你到底在乎什么?Python 爬虫告诉你!

大家好&#xff0c;我是安果&#xff01;有时候&#xff0c;我们想知道生活在这座城市的人每天交流的事情&#xff0c;然后对数据进行一些分析&#xff0c;方便我们更好地了解城市的特征及居民的需求以重庆为例&#xff0c;最火爆的论坛是购物狂&#xff0c;每天都有大量的帖子…

求解带不确定事件的FJSP的多目标强化学习框架

文献&#xff1a;Hao Wang, Junfu Cheng, Chang Liu, Yuanyuan Zhang, Shunfang Hu, Liangyin Chen,Multi-objective reinforcement learning framework for dynamic flexible job shop scheduling problem with uncertain events,Applied Soft Computing,Volume 131,2022,1097…

超级详细的python知识点及练习题(附答案)

今天咱们继续来学习python的小知识吖&#xff0c;上一次木有看的同学请看&#xff1a;python8大核心语句 作者&#xff1a;阿玥的小东东 学习&#xff1a;python&#xff0c;正在学习c 主页&#xff1a;阿玥的小东东 目录 1.复习及易错&#xff0c;快来学习&#xff01;&#…

基于python手撕实现BP 神经网络实现手写数字识别

本项目使用python实现全连接网络和梯度优化 方向传播并且实现了 手写数字识别项目: 神经网络 model 先介绍个三层的神经网络,如下图所示输入层(input layer)有三个 units( 为补上的 bias,通常设为

线程池ThreadPoolExecutor源码解析

参考视频 首先回顾一下创建线程等的三种方式 第一个是直接继承Thread类&#xff0c;重写run方法&#xff0c;这个其实内部也是继承了Runnable接口重写run方法。 比如&#xff1a; public class MyThread extends Thread{Overridepublic void run() {System.out.println("…

论文分享-《基于数据驱动多输出 ARMAX 建模的高炉十字测温中心温度》

1.简介 最近在学习研究NARMAX&#xff0c;故也分享下自己看的一篇论文。 2018 年 3 月 的《基于数据驱动多输出 ARMAX 建模的高炉十字测温中心温度》。主要是采用NARMAX模型进行预测&#xff0c;多输入多输出&#xff0c;有5个输出&#xff0c;预测中心五个点位的温度。下面讲…