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

C/C++文件操作(细节满满,part2)

该文章上一篇:C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客

专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客

目录

 

一、引言

二、文件的顺序

1、输入流和输出流

2、fputc

1.功能

2. 参数

3.用法

4.注意 

3、fgetc

1.功能 

2.参数

3.用法

4、fputs 

1、功能 

2、参数

3、用法

5、fgets 

​编辑 1、功能 

2、参数

3、用法

4、注意 

6、fprintf

1、功能 

2、参数

3、用法 

7、fscanf 

1、功能

2、参数

3、 用法

8、fwrite

​编辑

1、功能

2、参数

3、用法

4、注意 

9、fread 

1、功能

2、参数

3、用法

4、注意 

三、文件的随机读写

1、fseek

2、ftell 

3、rewind 

四、二进制文件和文本文件

五、文件读取结束的标志

1、文本文件读取结束标志

2、二进制文件读取结束标志

六、文件缓冲区


 

一、引言

通过上篇文章,已经了解了什么是文件打开和关闭文件的操作流的概念等。

如果对于上述的内容感到有点陌生了,不妨去看一看,文章链接在开头。

这篇文章的内容将会包含写文件的基本操作。

文件的顺序读写:是每次从第一个字符开始读和写。

文件的随机读写:是每次可以从任意一个位置读和写。

二、文件的顺序

适用文件功能函数名适用于
文本文件字符输入函数fgetc所有输入流
文本文件字符输出函数fputc所有输出流
文本文件文本行输入函数fgets所有输入流
文本文件文本行输出函数fputs所有输出流
文本文件格式化输入函数fscanf所有输入流
文本文件格式化输出函数fprintf所有输出流
二进制文件二进制输入fread文件
二进制文件二进制输出fwrite文件

1、输入流和输出流

流相当于是一个过渡的过程。怎么判上述函数是输入流还是输出流呢?

我们可以站在内存的视角来看,如果是数据流向内存,我们就可以看作是输入流。反之,则是输出流。

就以fgetc和fputc为例:

2、fputc

1.功能

将一个字符character写进stream流中。

2. 参数

character:字符(字符的本质就是ASCII码值,是整数)。

stream:文件指针。

3.用法

#include<stdio.h>
int main()
{//以‘只写’的方式打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 0;}//处理//输入for (int i = 'a'; i <= 'z'; i++)fputc(i, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

4.注意 

用什么方式打开文件就只能完成该功能。就比如说,以‘只写’的方式打开文件,就不能进行读取操作。

如果对于打开方式模糊了,请点击下面链接,查看上一篇的内容:

C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

3、fgetc

1.功能 

 从stream流中获取数据。

2.参数

文件指针类型的stream流。

3.用法

如果获取失败,函数将返回EOF

//以‘只读’的方式打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 0;}//处理//输出int ch;while((ch=fgetc(pf))!=EOF){printf("%c ",ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

4、fputs 

1、功能 

将一个字符串写入流中。

2、参数

str:需要写入文件的参数。

stream:文件流。

3、用法

如果没有‘\n’的话,他会把数据输入在一行。 

如果把文件指针pf换成stdout的话,程序会把数据打印在屏幕上。

#include<stdio.h>
int main()
{//以‘只写’的方式打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 0;}//处理fputs("abcd", pf);//不换行写法fputs("abcd\n", pf);//换行写法fputs("abcd", stdout);//将数据打印在屏幕上//关闭文件fclose(pf);pf = NULL;return 0;
}

5、fgets 

 1、功能 

从流中获取字符串。

2、参数

str:字符串。

num:读取的个数。

stream:文件流。

3、用法

如果获取失败,函数将返回EOF

#include<stdio.h>
int main()
{//以‘只读’的方式打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 0;}//处理char str[20];fgets(str, 10, pf);printf("%s", str);//关闭文件fclose(pf);pf = NULL;return 0;
}

4、注意 

  1. 函数最多只会读取一行的数据。
  2. 当数据足够多时,参数为num,函数只会读取num-1个数据。

6、fprintf

1、功能 

将格式化数据写入文件流中。

2、参数

通过将fprintf和printf的参数相比较,会发现,fprintf的参数就比printf的参数多了一个文件指针。 

3、用法 

#include<stdio.h>
struct S
{float f;char ch;int n;
};
int main()
{struct S s = { 4.14f,'w',1 };//以‘只 写’的方式打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 0;}//处理printf("%f %c %d\n", s.f, s.ch, s.n);fprintf(pf,"%f %c %d\n", s.f, s.ch, s.n);//关闭文件fclose(pf);pf = NULL;return 0;
}

7、fscanf 

1、功能

从流中读取数据。

2、参数

fscanf和scanf的参数差不多,多了一个文件流stream。

3、 用法

#include<stdio.h>
struct S
{float f;char ch;int n;
};
int main()
{struct S s = { 4.14f,'r',1 };FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 0;}//处理fscanf(pf, "%f %c %d", &(s.f), &(s.ch), &(s.n));printf("%f %c %d", s.f, s.ch, s.n);//关闭文件fclose(pf);pf = NULL;return 0;
}

8、fwrite

1、功能

将ptr中的数据写入流中,大小为size,个数为count。

2、参数

ptr:指向要写入文件流中的数据的指针。

size:每个数据的大小。

count:数据个数。

stream:要写入的文件流中。

3、用法

#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "wb");//abcdefif (pf == NULL){perror("fopen");return 0;}//处理char str[] = "abcd";fwrite(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

4、注意 

文件的打开方式要和函数匹配,要用二进制的写的方式

9、fread 

1、功能

从文件流中读取数据。

2、参数

ptr:指向文件流中的数据所要存到的位置的指针。

size:每个数据的大小。

count:数据个数。

stream:文件流。

3、用法

#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "rb");//abcdefif (pf == NULL){perror("fopen");return 0;}//处理char str[20];fread(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);printf("%s", str);//关闭文件fclose(pf);pf = NULL;return 0;
}

4、注意 

文件的打开方式要和函数匹配,要用二进制的读的方式

三、文件的随机读写

根据文件指针的位置和偏移量来确定文件指针的位置。

文件指针当前位置
SEEK_SETBeginning of file
SEEK_ENDCurrent position of the file pointer
SEEK_CUREnd of file

1、fseek

 功能是改变文件指针的位置。

#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r");//abcdefif (pf == NULL){perror("fopen");return 0;}//处理int ch;ch = fgetc(pf);//aprintf("%c\n", ch);ch = fgetc(pf);//bprintf("%c\n", ch);ch = fgetc(pf);//cprintf("%c\n", ch);fseek(pf, -1, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);//c//关闭文件fclose(pf);pf = NULL;return 0;
}

2、ftell 

功能是返回文件当前指针的偏移量。

#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r");//abcdefif (pf == NULL){perror("fopen");return 0;}//处理int ch;ch = fgetc(pf);//aprintf("%c\n", ch);ch = fgetc(pf);//bprintf("%c\n", ch);ch = fgetc(pf);//cprintf("%c\n", ch);int pos = ftell(pf);printf("%d", pos);//关闭文件fclose(pf);pf = NULL;return 0;
}

3、rewind 

功能是将文件指针返回起始位置。

#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r");//abcdefif (pf == NULL){perror("fopen");return 0;}//处理int ch;ch = fgetc(pf);//ach = fgetc(pf);//bch = fgetc(pf);//cint pos = ftell(pf);printf("%d\n", pos);rewind(pf);pos = ftell(pf);printf("%d", pos);//关闭文件fclose(pf);pf = NULL;return 0;
}

四、二进制文件和文本文件

根据数据的存储形式,文件可以分为二进制文件和文本文件。

数据在文件中以二进制存储,就是二进制文件。

数据在文件中以ASCII码值存储,就是文本文件。

五、文件读取结束的标志

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

1、文本文件读取结束标志

fgetc——判断是否为EOF

fgets——判断是否为NULL

2、二进制文件读取结束标志

fread——判断返回值是否小于实际要读的个数。

六、文件缓冲区

谢谢大家支持! 

相关文章:

C/C++文件操作(细节满满,part2)

该文章上一篇&#xff1a;C/C文件操作&#xff08;细节满满&#xff0c;part1&#xff09;_仍有未知等待探索的博客-CSDN博客 个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 …...

web前端面试-- 手写原生Javascript方法(new、Object.create)

web面试题 本人是一个web前端开发工程师&#xff0c;主要是vue框架&#xff0c;整理了一些面试题&#xff0c;今后也会一直更新&#xff0c;有好题目的同学欢迎评论区分享 ;-&#xff09; web面试题专栏&#xff1a;点击此处 手动实现Object.create 通过Object.create&#…...

C++前缀和算法的应用:得到连续 K 个 1 的最少相邻交换次数 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 滑动窗口 题目 给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动&#xff0c;你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包…...

目标检测YOLO实战应用案例100讲-基于YOLOv5的航拍图像旋转目标检测

目录 前言 国内外研究历史与现状 目标检测技术的研究历史与现状...

H5前端开发——BOM

H5前端开发——BOM BOM&#xff08;Browser Object Model&#xff09;是指浏览器对象模型&#xff0c;它提供了一组对象和方法&#xff0c;用于与浏览器窗口进行交互。 通过 BOM 对象&#xff0c;开发人员可以操作浏览器窗口的行为和状态&#xff0c;实现与用户的交互和数据传…...

stable diffusion如何解决gradio外链无法开启的问题

问题确认 为了确认gradio开启不了是gradio库的问题还是stable diffusion的问题&#xff0c;可以先执行这样一段demo代码 import gradio as grdef greet(name):return "Hello " name "!"demo gr.Interface(fngreet, inputs"text", outputs&q…...

SpringMvc-面试用

一、SpringMvc常用注解 1、修饰在类的 RestController RequestMapping("/test")RestController是什么&#xff1f;其实是一个复合注解 Controller //其实就是Component ResponseBody //独立的注解 public interface RestController {}RequestMapping 也可以认…...

并发编程 # 3

文章目录 一、进程和线程的比较二、GIL全局解释器锁1.引入2.Python解释器的种类结论&#xff1a;在CPython解释其中&#xff0c;同一个进程下开启的多线程&#xff0c;同一时刻只能有一个线程执行&#xff0c;无法利用多核优势。得出结论&#xff1a;GIL锁就是保证在同一时刻只…...

ESP32C3 LuatOS TM1650①驱动测试

合宙TM1650驱动资料 TM1650.lua源码 引脚连接 TM1650ESP32C3SCLGPIO5SDAGPIO4 下载TM1650.lua源码&#xff0c;并以文件形式保存在项目文件夹中 驱动测试源码 --注意:因使用了sys.wait()所有api需要在协程中使用 -- 用法实例 PROJECT "ESP32C3_TM1650" VERSION …...

TCP为什么需要三次握手和四次挥手?

一、三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包 主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备 过程如下&#xff…...

【C++】一些C++11特性

C特性 1. 列表初始化1.1 {}初始化1.2 initializer_list 2. 声明2.1 auto2.2 typeid2.3 decltype2.4 nullptr 3. STL3.1 新容器3.2 新接口 4. 右值引用5. 移动构造与移动赋值6. lambda表达式7. 可变参数模板8. 包装器9. bind 1. 列表初始化 1.1 {}初始化 C11支持所有内置类型和…...

leetcode 647. 回文子串、516. 最长回文子序列

647. 回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#…...

Vue Router 刷新当前页面

Vue项目, 在实际工作中, 有些时候需要在 加载完某些数据之后对当前页面进行刷新, 以期 onMounted 等生命周期函数, 或者 数据重新加载. 总之是期望页面可以重新加载一次. 目前总结有三种途径可实现以上需求: 一, reload 直接刷新页面 window.location.reload(); $router.go(…...

lstm 回归实战、 分类demo

预备知识 lstm 参数 输入、输出格式 nn.LSTM(input_dim&#xff0c;hidden_dim,num_layers); imput_dim 特征数 input:(样本数、seq, features_num) h0,c0 (num_layers&#xff0c;seq, hidden_num) output: (样本数、seq, hidden_dim) 再加一个全连接层&#xff0c;将 outpu…...

实践DDD模拟电商系统总结

目录 一、事件风暴 二、系统用例 三、领域上下文 四、架构设计 &#xff08;一&#xff09;六边形架构 &#xff08;二&#xff09;系统分层 五、系统实现 &#xff08;一&#xff09;项目结构 &#xff08;二&#xff09;提交订单功能实现 &#xff08;三&#xff0…...

`SQL`编写判断是否为工作日函数编写

SQL编写判断是否为工作日函数编写 最近的自己在写一些功能,遇到了对于工作日的判断,我就看了看sql,来吧!~(最近就是好疲惫) 我们一起看看(针对ORACLE) 1.声明: CREATE OR REPLACE PACKAGE GZYW_2109_1214.PKG_FUN_GETDAY_HDAY AS /** * 通过节假日代码获取指定的日期[查找基…...

零信任身份管理平台,构建下一代网络安全体系

随着数字化时代的到来&#xff0c;网络安全已成为企业和组织面临的一项重要挑战。传统的网络安全方法已经无法满足不断演变的威胁和技术环境。近期&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;发布了《零信任发展研究报告&#xff08; 2023 年&a…...

《数据结构、算法与应用C++语言描述》使用C++语言实现链表队列

《数据结构、算法与应用C语言描述》使用C语言实现链表队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一端称…...

RT-Thread学习笔记(四):RT-Thread Studio工具使用

RT-Thread Studio工具使用 官网详细资料实用操作1. 查看 RT-Thread RTOS API 文档2.打开已创建的工程3.添加头文件路径4. 如何设置生成hex文件5.新建工程 官网详细资料 RT-Thread Studio 用户手册 实用操作 1. 查看 RT-Thread RTOS API 文档 2.打开已创建的工程 如果打开项目…...

【计算机网络笔记】OSI参考模型中端-端层(传输层、会话层、表示层、应用层)功能介绍

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...