文件操作详解(1)

1.文件,文件与流,文件指针

2.文件的打开与关闭

3.文件的读写

文件的顺序读写:

(1)fgetc 和 fputc

(2)fgets 和 fputs

(3)fscanf 和 fprintf

(4)fread 和 fwrite


一.文件,文件与流,文件指针

1.文件的介绍:

(1)如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤ ⽂件

(2)磁盘(硬盘)上的⽂件是⽂件, 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)

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

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

但根据数据的组织形式,数据文件又分为文本文件(.txt)二进制文件(以二进制存储的文件),那一个数据又是如何在内存中存储呢:

(而在文件操作这一章,我们主要是将数据存入  .txt文件 或从 .txt文件里读取。)

(3)文件名:⽂件名包含3部分:文件路径+文件名主干+文件后缀

 例如: c:\code\test.txt

 2.文件与流:

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

(2)标准流:在C语言启动时默认打开的三个流:

stdin—标准输入流:在大多数环境中从键盘输入,scanf函数就从这里读取数据

stdout—标准输出流:⼤多数的环境中输出⾄显示器界⾯,printf函数就是将信息输出到标准输出 流中

stderr—标准错误流:⼤多数环境中输出到显⽰器界⾯

tdin、stdout、stderr三个流的类型是: FILE * ,通常称为⽂件指针

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

3.文件指针:

简而言之,C语言里FILE*文件指针用来维护流中的各种操作,在文件操作时就不可避免地使用到FILE*指针,由于文件指针指向该文件的信息区,那我们就可以通过文件指针变量简洁地找到文件以及与它相关的文件。


二.文件的打开与关闭

1.fopen(打开文件)与fciose(关闭文件):

当我们打开一个原本并不存在的文件时,VS会自动帮助我们在该项目路径底下创建一个文件

下面我们说说函数原型和文件的使用方式:

(1)fopen和fclose的函数原型:

filename表示文件名

stream表示文件指针

mode则是我接下来要说的文件的打开方式

(2)文件的打开方式:

例如我在文件里写一句话:

(注意,这里使用fopen等函数时,VS可能会默认其具有不安全性,因此需要在开头加上一句:#define  _CRT_SECURE_NO_WARNINGS


三.文件的读写

1.文件的顺序读写:

(其实我在上面已使用了fputs函数,但这里还是对fputs等一系列函数进行一下详细说明)

(1)fgetc (字符输入函数)

这两个函数全名叫做字符输入/出函数,适用于所有的输入/出流

同时这里也展示一下“w”的危害,他会清空我们原文件里的内容,使接下来的读取产生错误:

当然,读取所有字符也是可以的:

但这里我算过总字符的个数,所以写的12,但若读取的字符超过文件里的字符数,就会产生以下情况:

值得注意的是:

(1)当每次读取完成后,光标后往后移动一位。这时候我们在进行读取操作,就会读取到下一个字符。我们利用这个特性,用循环进行读取,达到读取字符串的功能。但是由于我们只有12个字符,所以打印出来后3个位置是错误信息。

(2)另外有一点需要注意,fgetc在遇到空格时会选择跳过。

接下来说说  fputc

(2)fputc(字符输出函数):

以下为fputc的简单使用:

但有一个地方非常值得注意,就是在“w”的方式下,以下这串代码是无法实现的:

在“w”的打开方式下,fgetc无法读取的原因主要有两点:

(1)“w”是以写的方式打开文件

(2)写完之后光标移动到了写入字符的末尾,因此再往后读取是什么都读不到的

(3)fgets(文本行输入函数):

         适用于所有输入流

char *str: 指向存储读取数据的字符数组的指针
int n: 需要读取的最大字符数,包括终止字符 \0
FILE *stream: 输入文件流的指针

成功时,返回指向字符串的指针str

失败或者读取到文件结尾时返回NULL

在使用时这个函数时,可以理解为fgets作为一个文本(字符串)输入(输入到vs里的调试面板)函数,需要先创建一个数组来容纳从其他文件传来的字符串,再打印到面板上(同时,需要注意的是这个函数也是要在“r”只读情况下使用)

(这两种方式都行)

(4)fputs(文本行输出函数):

         适用于所有输出流

const char *str:指向要写入的字符串的指针

FILE *stream:输出文件流的指针

成功时返回非负值(通常为0)

失败返回 EOF

这里直接在文件里写出了“WTF!”,同时也印证了“w”方式下写入会清空上一次的文件输入

(5)fscanf(格式化输入函数):

         仅适用于文件输入流

fscanf函数用于从文件指针fp指向的文件中读取数据,根据format参数指定的格式化字符串来解析数据,并将解析的数据存储到后续的参数中,如果遇到文件结束或错误,返回EOF‌

(这个函数与scanf函数的用法非常非常相似,也就是意味着这个函数只要满足对应就可以实现多个参数的同时使用)

 (6) sprintf (格式化输出函数):

    适用于文件输出流

与printf一样,也可以传入多个参数并写入文件

(7)fread(二进制输入函数):

ptr‌:传入存放字符串的地址
size‌:每个数据单元的大小(以字节为单位)
‌nmemb‌:要读取的数据单元的数量
‌stream‌:文件指针,指向要读取的文件
返回值‌:fread函数返回成功读取的数据单元数量。如果返回值小于nmemb,则可能是遇到了文件结尾或发生了读取错误‌

(8)fwrite(二进制输出函数):

ptr‌:指向要写入数据的内存区块的指针,可以是数组、变量、结构体等。
‌size‌:表示每个数据块的字节数。
nmemb‌:表示要写入的块数。
stream‌:文件指针,指向要写入的文件。
返回值‌:fwrite函数返回成功写入的块数,即nmemb

综上,关于文件的顺序读写就分享到这,以下为顺序读写函数的汇总:

ok,到现在也讲了很多知识了,那接下来关于文件的随机读写,sprintf和sscanf,⽂件读取结束的判定以及缓冲区的介绍就留到文件操作(2)再做详细介绍吧。

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

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

相关文章

基于YOLOv8深度学习的人体姿态摔倒检测与语音报警系统(PyQt5界面+数据集+训练代码)

随着人口老龄化进程的加速,摔倒事故逐渐成为威胁老年人健康和安全的主要问题之一。研究表明,摔倒不仅可能导致老年人骨折、头部受伤等严重的身体损伤,还可能引发心理恐惧和行动能力下降,从而降低其生活质量和独立性。如何快速、准…

jmeter5.6.3安装教程

一、官网下载 需要提前配置好jdk的环境变量 jmeter官网:https://jmeter.apache.org/download_jmeter.cgi 选择点击二进制的zip文件 下载成功后,默认解压下一步,更改安装路径就行(我安装在D盘) 实用jmeter的bin目录作为系统变量 然后把这…

差分进化算法原理与复现

目录 摘要1、算法原理1.1、种群初始化1.2、变异1.3、交叉1.4、选择 2、算法实现2.1、种群初始化2.2、变异2.3、交叉2.4、选择2.5、选取终代种群中最优秀个体 摘要 如何选取一组最佳的参数,使得代价函数值最优?这是优化算法做的事,一个直觉的…

搜索引擎中广泛使用的文档排序算法——BM25(Best Matching 25)

在搜索场景中,BM25能计算每个文档与查询的匹配度,从中找出最相关的文档,并按相关性高低排序展示。 要理解BM25,需要掌握以下几个关键概念: 1. 词频(Term Frequency, TF):某关键词在文…

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式,枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述,如有错误,请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…

【C++】list模拟实现(详解)

本篇来详细说一下list的模拟实现,list的大体框架实现会比较简单,难的是list的iterator的实现。我们模拟实现的是带哨兵位头结点的list。 1.准备工作 为了不和C库里面的list冲突,我们在实现的时候用命名空间隔开。 //list.h #pragma once #…

数字化工厂 MES试点方案全解析(三)

目 录 三、试点实施步骤 需求分析与方案设计阶段 系统开发与测试阶段 系统部署与培训阶段 试点运行与优化阶段 总结与评估阶段 三、试点实施步骤 需求分析与方案设计阶段 1、成立由企业生产、工艺、质量、设备、IT 等多部门人员组成的项目团队,与 MES 供应商共…

ShuffleNet V2:高效卷积神经网络架构设计的实用指南

摘要 https://arxiv.org/pdf/1807.11164 当前,神经网络架构设计大多以计算复杂度的间接指标,即浮点运算数(FLOPs)为指导。然而,直接指标(例如速度)还取决于其他因素,如内存访问成本…

【Opencv学习】PART1-图像基础处理

目录 一、图像的读入、显示和保存 1、读入图像 imread函数 范例 显示控制参数 2、显示图像 imshow函数 范例 tips waitkey函数 含义 delay参数: tips destoryAllWindows函数 3、保存图像 imwrite函数 范例 实操 01-读入显示保存 代码 结果 二、图像处理入…

硬中断关闭后的堆栈抓取方法

一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段,帮助我们发现问题,识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里,除了panic问题…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验,同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏,排除了清晰度和功耗之间的平衡问题。该芯片…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台,具有简单轻量的部署方式与多样的功能,支持多种协议(如GB28181、RTSP、Onvif、RTMP)和设备类型(IPC、NVR等),提供视频直播、录像、回放…

ETAS工具导入DBC生成Com协议栈

文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…

图形化界面MySQL(MySQL)(超级详细)

1.官网地址 MySQL :: Download MySQL Workbench 1.1在Linux直接点击NO thanks..... 下载完后是这个页面 1.2任何远端登录,再把jj数据库给授权 1.3建立新用户 进行连接 点击这个就运行了 只执行show tables;要先选中 圆圈处支持自己输入 点击这个就执…

vulhub靶场与pikachu靶场

一、搭建vulhub 环境:kaildocker 1.1 提权: :::color4 sudo su #权限升级为root ::: 1.2更新软件: :::color4 apt-get update ::: (此处我已更新过) 1.3安装HTTPS协议和CA证书: :::color4 apt-get install -y apt-transpo…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期:20241124 学习目标:http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记: 安装requests 安装方式:pip/pip3 install requests 官网教程:Requests: HTTP fo…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…

Docker安装ubuntu1604

首先pull镜像 sudo docker run -d -P m.daocloud.io/docker.io/library/ubuntu:16.04国内使用小技巧: https://github.com/DaoCloud/public-image-mirror pull完成之后查看 sudo docker images 运行docker sudo docker run -d -v /mnt/e:/mnt/e m.daocloud.io/…

【数据结构与算法】树和二叉树

【数据结构与算法】树和二叉树 文章目录 【数据结构与算法】树和二叉树前言一、树的基本概念二、二叉树的基本概念三、二叉树的递归遍历四、二叉树的编程五、二叉树的非递归遍历总结 前言 本篇文章将讲到树的基本概念,二叉树的基本概念,二叉树的递归遍历…