零基础非科班也能掌握的C语言知识20 文件操作

文件操作

  • 1.文件相关概念
  • 2.流和标准流
    • 2.1流
    • 2.2标准流
  • 3.文件指针
  • 4.文件的打开关闭
  • 5.文件的顺序读写
  • 6.文件的随机读写
    • 6.1 fseek
    • 6.2 ftell
    • 6.3 rewind
  • 7.⽂件读取结束的判定
    • 7.1 feof
  • 8.文件缓冲区

1.文件相关概念

在这里插入图片描述
在这里插入图片描述

2.流和标准流

2.1流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

2.2标准流

在这里插入图片描述

3.文件指针

在这里插入图片描述
也就是说我们将文件的相关信息保存在名为FILE的结构体变量中,然后我们通过File*的指针来访问该结构体的
在这里插入图片描述

4.文件的打开关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSI C规定使⽤ fopen 函数来打开⽂件,fclose 来关闭⽂件。
在这里插入图片描述
注意使用fopen函数时还应指定用什么方式来打开文件,接下来会介绍有关方式在这里插入图片描述
区分一下“r”和“w”,r意为读取,w意为写。并且以读的方式打开就只能读,以写的方式打开就只能写
在这里插入图片描述
例子

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror("data.txt");//perror可以查明错误原因。
		return 1;
	}
	fclose(pf);
	pf=NULL://注意置为空指针
	return 0;
}

在这里插入图片描述
当然以读的形式打开如果找不到当前文件的话则会新建一个data.txt文件,若存在data.txt文件则会将内容清空。其它的大家可以自己尝试

5.文件的顺序读写

在这里插入图片描述
scanf/fscanf/sscanf
printf/fprintf/sprintf
包括这些函数一起讲了
在这里插入图片描述
参数为文件指针
从文件中读取字符返回整形(也就是字符的ASCII码值),有些同学可能疑惑为什么返回的是整形实际上读取过程中可能遇到错误此时返回的就是EOF(end of file)就是-1,这样一想是不是用整形来接受就比较好理解了
在这里插入图片描述
参数为字符指针,整形,文件指针
从文件中读取num-1个字符(注意这里仅仅会读取文件中num-1个字符存放在字符串并主动将字符串第n个字符置为’\0’),并且倘若在读文件时遇到换行符默认为文件结尾将换行符保存在字符串中并将下一位字符置为’\0’,若读取过程没遇到错误返回的指针即为字符串指针否则返回NULL;
在这里插入图片描述
参数为整形(指的是字符ASCII码值或直接字符也行)和文件类型指针
将字符存入文件中。
在这里插入图片描述
参数文件类型指针和字符指针
将字符串存入文件中
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
参数为一个const修饰的字符指针和…
参数为文件类型指针和一个const修饰的字符指针,和…
参数为字符类型指针和一个const修饰的字符指针,和…
也许有些同学会觉得这怎么区分,其实我们可以从scanf来理解,我们往往使用scanf(‘%d’,&a)是这样的形式,那同理fscanf,sscanf后面两个参数也是如scanf的形式不同的只是第一个参数罢了
当然你肯定要掌握scanf函数才能真正区分这三个函数,如果不太理解scanf函数的话可以先看看博主写的你真的懂scanf函数吗。
简单来说scanf函数就是将标准输入流的数据存储在变量中,因此我们可以理解为
fscanf(stdio,“%d”,&a)等同于scanf(‘%d’,&a),这样你就掌握了这两组函数,同理sscanf函数只是将输入端从文件指针类型变为字符指针类型罢了
如果你懂了上述内容,想必你也会理解如何区分printf,fprintf,sprintf
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同理printf函数就是将字符串打印在标准输出流中,因此我们可以理解为
fprintf(stdout,“%d”,&a)等同于scanf(‘%d’,a),这样你就掌握了这两组函数,同理sscanf函数只是将输出端从文件指针类型变为字符指针类型罢了。
有些同学可能没学前还能区分scanf和printf,看完这就不会了。提供给大家一个一劳永逸的方法,就是printf就是将后面的东西存在前面去,scanf就是将前面的东西存在后面去,包括其他两组也是这样的,或者你看到后面的可变参数…中有取地址符号就知道要存到这里去(意思可变参数是一个指针)
在这里插入图片描述
fread读取近似scanf就是(前面存到后面)将ptr指向的内存块中count个size字节的内存储存到文件中
在这里插入图片描述
fwrite写近似于printf就是(后面存到前面)将文件中count个size字节内容存到ptr指向的内存块中

6.文件的随机读写

6.1 fseek

根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。
在这里插入图片描述
origin有三个
在这里插入图片描述
也就是光标会根据你给的起始和偏移量在文件中定位光标

6.2 ftell

在这里插入图片描述

6.3 rewind

在这里插入图片描述

7.⽂件读取结束的判定

7.1 feof

在这里插入图片描述
这个函数经常被人误用它不是用来判断文件结尾的而是用来判断当其他读写函数返回EOF时是因为遇到了错误还是遇到了文件结尾
而判断文件结尾的标志应是
在这里插入图片描述

8.文件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。

#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试 
int main()
{
 FILE*pf = fopen("test.txt", "w");
 fputs("abcdef", pf);//先将代码放在输出缓冲区 
 printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");
 Sleep(10000);
 printf("刷新缓冲区\n");
 fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘) 
 //注:fflush 在⾼版本的VS上不能使⽤了 
 printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");
 Sleep(10000);
 fclose(pf);
 //注:fclose在关闭⽂件的时候,也会刷新缓冲区 
 pf = NULL;
 return 0;
}

因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。否则读写会出问题也就是数据仅仅在缓冲区上而没有存在在内存中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分层解耦

三层架构 controller:控制层&#xff0c;接收前端发送的请求&#xff0c;对请求进行处理&#xff0c;并响应数据&#xff0c; service:业务逻辑层&#xff0c;处理具体的业务逻辑。 dao:数据访问层(Data Access Object)(持久层)&#xff0c;负责数据访问操作&#xff0c;包括数…

Linux文件权限信息和Linux文件与文件夹的管理

目录 前言一、系统环境二、Linux文件权限信息2.1 查看Linux文件权限信息2.2 修改Linux文件权限信息2.2.1 chmod命令2.2.2 chown命令 三、Linux文件与目录的管理3.1 查看文件或文件夹3.1.1 查看文件内容3.1.2 查看文件夹内容 3.2 新增文件或文件夹3.2.1 新增文件3.2.2 新增文件夹…

Node.js版本管理工具-NVM

在开发 Node.js 项目时&#xff0c;经常会遇到需要切换不同版本的 Node.js 的情况。为了方便管理和切换各个版本&#xff0c;我们可以使用一些 Node.js 版本管理工具。 Node Version Manager&#xff1a;简称NVM&#xff0c;最流行的 Node.js 版本管理工具之一。它允许我们在同…

C++---模板进阶(非类型模板参数,模板的特化,模板分离编译)

我们都学习和使用过模板&#xff0c;而这篇文章我们来将一些更深入的知识。在此之前&#xff0c;我们在使用C编程时可以看到模板是随处可见的&#xff0c;它能支持泛型编程。模板包括函数模板和类模板&#xff0c;我们有的人可能会说是模板函数和模板类&#xff0c;但严格讲这样…

【话题】评价GPT-4o:从革命性技术到未来挑战

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言技术原理应用领域实际案例优势挑战局限性未来展望文章推荐 引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术的进步一直是推动技术革…

Allegro蛇形等长

Allegro蛇形等长 一、蛇形等长规则创建方法 一般有点对点&#xff0c;串组两种形式 点对点一般直接在规则中建立等长组 串组可以用模型等长和pin to pin等长 下面提供pin to pin的方法&#xff0c;个人感觉最好用 二、创建规则 打开规则管理器&#xff0c;展开Electrical–…

Studio One安装教程+软件安装包下载

Studio One6全新版本上线 记录、生产、混合、掌握和执行所有操作。从工作室到舞台&#xff0c;Studio One6以易用为核心&#xff0c;是您的创意合作伙伴。 当你准备好登上舞台时&#xff0c;Studio One就在那里。只有Studio One从最初的灵感到完整的制作&#xff0c;最终混音…

【STM32】基于I2C协议的OLED显示(利用U82G库)

【STM32】基于I2C协议的OLED显示(利用U82G库) 文章目录 【STM32】基于I2C协议的OLED显示(利用U82G库)一、实验背景二、U8g2介绍&#xff08;一&#xff09;获取&#xff08;二&#xff09;简介 三、实践&#xff08;一&#xff09;CubexMX配置&#xff08;二&#xff09;U8g2配…

官方正版 | Mailbird - 2024 年最佳电子邮件客户端

Mailbird&#xff1a;个性化的电子邮件客户端 Mailbird 是一款专为 Windows 用户设计的桌面电子邮件客户端&#xff0c;以其用户友好的界面和强大的功能获得了广泛好评。以下是 Mailbird 的主要特点&#xff1a; 个性化背景&#xff1a;Mailbird 提供了可定制的背景选项&#…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 消息对话框QMessageBox 文章编号&#xff1a;Q…

linux pxe和无人值守

一 PXE和无人值守 pxe c/s模式 允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像 加载安装文件 实现自动化安装操作系统 无人值守 就是安装选项不需要认为干预 可以自动化实现 pxe的优点 1 规模化 同时装配多台服务器 20多 30台 2 自动化 …

Rust学习06:使用CSDN的AI工具“C知道”分析代码错误

朋友们&#xff0c;我最近真的是在绝望的边缘了&#xff01; Rust咋这么蓝涅&#xff01; 资料咋这们少涅&#xff01; 记得学Python的时候&#xff0c;基本上你遇到的所有问题都可以在书上或者网上找到答案&#xff0c;中文世界找不到那么在英文世界一定能找到答案。 我猜&…

Redis】Redis主从复制(二)————主从结构/流程

目录 回顾slaveof 命令断开主从复制关系切换主从复制关系只读网络延迟问题应对措施补充 主从结构一主一从结构问题改进 一主多从结构树形主从主从切换结构 主从复制流程简单来记关于数据同步两个参数replicationidoffset. psync 运行流程全量复制和部分复制全量复制流程&#x…

使用使用rundll32 调用指定dll的方法

使用使用rundll32 调用指定dll的方法 //顾名思义&#xff0c;"执行32位的DLL文件"。它的作用是执行DLL文件中的内部函数&#xff0c;这样在进程当中&#xff0c; 只会有Rundll32.exe&#xff0c;而不会有DLL后门的进程&#xff0c;这样&#xff0c;就实现了进程上的隐…

自定义组件——ABManager(AB包管理器)

需求描述 在Unity3D引擎中&#xff0c;AB包作为常用的游戏资源存储格式之一。而对于资源管理我们就不得不谈到集中管理的优势了&#xff0c;通过统一的接口加载和卸载AB包及其中的资源将进一步提升我们的编程效率。本文将围绕这个需求进行尝试。 功能描述 1. AB包的加载包括同…

项目:双人五子棋对战-对战模块(6)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 当玩家进入到游戏房间后, 就要开始一局紧张而又刺激的五子棋对战了, 本文将就前端后端的落子与判断胜负的部分作详细讲解. 模块详细讲解 约定前后端交互的接口 首先是建立连接后, 服务器需要生成一些游戏的初始信息(可…

java程序在运行过程各个内部结构的作用

一&#xff1a;内部结构 一个进程对应一个jvm实例&#xff0c;一个运行时数据区&#xff0c;又包含多个线程&#xff0c;这些线程共享了方法区和堆&#xff0c;每个线程包含了程序计数器、本地方法栈和虚拟机栈接下来我们通过一个示意图介绍一下这个空间。 如图所示,当一个hell…

63-目录操作(QDir类)及展示系统文件实战

一、目录操作(QDir 类) #include <QCoreApplication>#include <QDir> #include <QStringList> #include <QtDebug>// 自定义函数实现获取目录下大小qint64 GetDirFileInfoSizeFunc(const QString &qpath) {// QDir类专门用来操作路径名称或底层文…

catia零件装配时预览零件的形状

这样的显示方式看不到 选择大或中图标就可预览零件形状

Qt | openSSL将TCP数据进行不对称(RSA)加密传输-windows平台实操(可行)

01、windows平台工具准备 QtQt5.14.2openSSL下载(选择适合自己的版本即可)https://slproweb.com/products/Win32OpenSSL.htmlTCP调试助手调试助手02、简介 首先简单介绍一下openssl。接着描述如何在windo