文件操作(2)

news/2024/11/29 6:53:25/

目录

文件操作的步骤:

 流:

标准流: 

 文件指针:

文件信息区: 

概念:

关系转化: 

注意:

文件指针: 

文件的打开和关闭:

打开方式:

打开成功:

 读写的概念:

 操作代码演示:

相对路径和绝对路径:

绝对路径:

相对路径:

举例:



文件操作的步骤:

  1. 打开文件 
  2. 读/写文件
  3. 关闭文件

 流:

因为要朝不同的外部设备输出数据,或者从不同的外部设备中获取数据,这当中获取和拿取的过程和操作都是不同的,所以诞生了一个统一的操作和概念——流。

例如:C语言程序可以通过流获取数据,也可以将数据输送到流中至于后面传输到不同设备的操作,或者流从各种设备中拿取数据的操作都是由流负责程序只负责将数据从流中拿走,或者输出数据到流中。

 所以打开文件也相当于打开流

标准流: 

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语言程序在启动的时候,默认打开了3个流:

  • stdin- 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据
  • stdout- 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中
  • stderr- 标准错误流,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。stdin、stdout、stderr 三个流的类型是: FILE*,通常称为文件指针。

C语言中,就是通过FILE* 的文件指针来维护流的各种操作的。

 文件指针:

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

文件系统:文件系统就是C盘D盘这种,就是操作系统中管理文件的系统。

 

文件信息区: 

概念:

  • 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。
  • 这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE. 

关系转化: 

文件信息区存放文件名字状态位置等等,而这些信息就是存放在一个结构体变量中,也就是说这个文件信息区就是一个结构体变量,或者说文件信息区是由一个FILE类型的结构体来描述的。

注意:

  1. 不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
  2. 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。 

文件指针: 

 FILE* pf;//⽂件指针变量
  • 可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变 量)。
  • 通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与 它关联的⽂件。 

 而且打开文件就会有文件信息区,文件信息区都会由一个文件指针维护,通过文件指针就可以操作这个文件。

 

文件的打开和关闭:

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSIC规定使用 fopen 函数来打开文件fclose 来关闭文件。

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

打开方式:

打开成功:

 

 读写的概念:

 操作代码演示:

 

 FILE*pf = fopen("test .txt","w");

注意当前的文件所在处是编译器安排的,如果要打开别的地方的文件则需要使用路径。

相对路径和绝对路径:

绝对路径:

  fopen("C:\\Users \\zpeng\\Desktop\\test.txt","w ");

 

相对路径:

  •  .  表示路径,或者说是当前路径
  • ..  表示上一级的路径
举例:
FILE* pf = fopen("./../../test.txt","w");

当前路径的位置下的上一级路径的上一级路径。

FILEx pf = fopen("./../../hehe/test .txt","w");

 当前路径的位置下的上一级路径的上一级路径下的hehe文件下的test.txt文件

FILEx pf = fopen(".\\..\\..\\hehe\\test .txt","w");

两种写法一样.


http://www.ppmy.cn/news/1121337.html

相关文章

C++ 共享内存相关的API

C 共享内存相关的API 1.什么是共享内存1.共享内存的概念2.共享内存的原理3.共享内存使用注意点 2.共享内存有关API的操作函数及示例1.新建共享内存-shmget2.连接共享内存到当前的地址空间-shnat3.当前进程分离共享内存shmdt4.控制共享内存-shmctl5.共享内存操作示例 3.共享内存…

【Python基础】各种情况的报错汇总

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

中兴R5300 G4服务器iSAC管理员zteroot密码遗失的重置方法及IPV6地址启用设置

本文讲解中兴R5300 G4服务器BMC带外iSAC管理员zteroot密码遗失,无法登录时如何对其进行密码重置,以及iSAC启用IPV6地址的方法。 一、重置中兴R5300 G4服务器iSAC管理员zteroot密码 1、通过SSH登录到iSAC,默认用户名:sysadmin&am…

MySQL与PostgreSQL对比

MySQLPostgreSQL数据类型支持支持JSON,但不如PostgreSQL支持更多的数据类型,如数组、hstore、JSON、JSONB、范围类型等扩展性有一些扩展性,但不如PostgreSQL支持自定义数据类型、函数、操作符,具有强大的扩展性SQL兼容性遵循SQL标…

基于Vue+ELement搭建登陆注册页面实现后端交互

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

若依注解学习(一)@Log

Log 涉及到: Log,LogAspect,SecurityUtils,SysUser,SysOperLog,BusinessStatus,StringUtils,ServletUtils AsyncManager,AsyncFactory&#xff…

时间轮算法

思考 假如现在有个任务需要3s后执行,你会如何实现? 线程实现:让线程休眠3s 如果存在大量任务时,每个任务都需要一个单独的线程,那这个方案的消耗是极其巨大的,那么如何实现高效的调度呢? 时…

多线程-定时器、线程池

阻塞队列介绍标准库阻塞队列使用基于阻塞队列的简单生产者消费者模型。实现一个简单型阻塞队列 (基于数组实现) 定时器标准库的使用 线程池使用线程数目确定 阻塞队列介绍 不要和之前学多线程的就绪队列搞混; 阻塞队列:也是一个…