75.【C语言】文件操作(3)

目录

6.文件的顺序读写

1.几个顺序读写函数

1.fgetc函数

代码示例

代码改进

2.fputc函数

3.fputs函数

如果需要换行,应该写入换行符(\n)

4.fgets函数

1.读取单行字符串

2.读取多行字符串


6.文件的顺序读写

1.几个顺序读写函数

分组:(fgetc,fputc),(fgets,fputs),(fscanf,fprintf),(fread,fwrite)

1.fgetc函数

声明:int fgetc ( FILE * stream );

格式:fgetc(指针);

作用:从流中取得字符

如果读取成功,返回字符(提升为int型,因此建议用int类型的变量来接收返回值),当读到文件末尾时,返回EOF

如果读取失败,返回EOF

代码示例

如果abc.txt内的字符个数充足的话,这是读取abc.txt的前5个字符

#include <stdio.h>
int main()
{
	FILE* p = fopen("abc.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;//错误返回
	}
	int ch = 0;
	 ch = fgetc(p);
	printf("%c", ch);
	 ch = fgetc(p);
	printf("%c", ch);
	 ch = fgetc(p);
	printf("%c", ch);
	 ch = fgetc(p);
	printf("%c", ch);
	fclose(p);
	p = NULL;//将野指针置空
	return 0;
}

x86+debug环境,用VS调试, 打开内存窗口,输入p

执行完int ch = fgetc(p);

执行完第一个ch = fgetc(p);

执行完第二个ch = fgetc(p);

执行完第三个ch = fgetc(p);

执行完第四个ch = fgetc(p);

......

会发现,每执行一次fgetc函数时,0x01458F48处的数据(即指针p的数据)+1,0x1469F50处的数据-1

代码改进

如果想一直读取字符到结尾,可以这样改进

	int ch = 0;//ch为返回值接收变量
	while ((ch=fgetc(p))!=EOF)
		printf("%c", ch);

注意到fgetc函数支持所有的输出流, 因此使用以下代码可以从标准输入流中打印字符至屏幕

while ((ch=fgetc(stdin))!=EOF)
        printf("%c", ch);

 图中实际上输入了"abcdefg\n"和"csdn\n"

如果不按Ctrl+Z(向显存写入EOF),光标会一直处于等待状态

备注:Windwos下,EOF为<stdio.h>定义的一个常量 #define EOF    (-1)

具体细节参见32.【C语言】详解scanf

2.fputc函数

声明:int fputs ( const char * str, FILE * stream );

格式:fputs(' ',指针);

作用:向文件中写入一个字符

#include <stdio.h>
int main()
{
	FILE* p = fopen("abc.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;//错误返回
	}
	fputc('a', p);
	fclose(p);
	p = NULL;//将野指针置空
	return 0;
}

向abc.txt写入字符a

注意到fputc函数支持所有的输出流,因此使用fputc('a', stdout);可以将字符a显示到屏幕上

3.fputs函数

声明:int fputs ( const char * str, FILE * stream );

格式:fputs("字符串", 指针);

作用:向文件中写入一串字符

#include <stdio.h>
int main()
{
	FILE* p = fopen("abc.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;//错误返回
	}
	fputs("abcdefgh", p);
	fclose(p);
	p = NULL;//将野指针置空
	return 0;
}

 

如果再添加一行,再次运行

fputs("Hello World!", p);

并没有放在两行

如果需要换行,应该写入换行符(\n)
fputs("\nHello World!", p);

4.fgets函数

声明:char * fgets ( char * str, int num, FILE * stream );

格式:fgets(接收指针, 读取当前行的字符个数, 文件指针);

作用:读取字符串

细节之"0D 0A"

先向abc.txt写入,再用HxD.exe查看

发现每行字符串间隔了0D 0A,这为fgets打印多行字符串提供了帮助

查ASCII码表可知

CR(0DH)为回车(转义字符\r),LF(0A)为换行(转义字符\n)

具体为什么这样设计的原因有两点

1.早期的打字机在写一行结束的时候,要做两个动作才能从下一行开始打印

回车(打字头归位)-->换行(打字机上卷一行),Windows的记事本保留了这一特点

2.取决于操作系统,可参见此网站Introducing extended line endings support in Notepad

下面是关键信息的截图

在Windows中,采用CR+LF(0D 0A)的形式;在Unix或Linux中,采用LF(0A)的形式;在麦金塔中,采用CR(0D)的形式............(详见下图)

下图为https://www.sttmedia.com/newline提供的更详细的信息


1.读取单行字符串
#include <stdio.h>
int main()
{
	FILE* p = fopen("abc.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;//错误返回
	}
	char arr[100];//arr用来接收读取到的字符串
	fgets(arr, 100, p);//第2个参数写入100,为的是能够最大化读取当前行的字符串
	printf("%s", arr);
	fclose(p);
	p = NULL;//将野指针置空
	return 0;
}

2.读取多行字符串

如果要读取多行,可以多次写

fgets(arr, 100, p);
printf("%s", arr);

也可以写循环

	while (fgets(arr, 100, p) != NULL)
	{
		printf("%s", arr);
	}

注意:此次调用fgets函数会覆盖掉上一次读取的内容

如将上方部分代码改成

	fgets(arr, 100, p);
	fgets(arr, 100, p);
	fgets(arr, 100, p);

VS调试,打开监视窗口

除此之外,fgets会在读取完当前行后,在arr数组中写入\0以示结束

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

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

相关文章

【数据结构-栈】【位运算优化】力扣3170. 删除星号以后字典序最小的字符串

给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时&#xff0c;你可以执行以下操作&#xff1a; 删除最左边的 ‘’ 字符&#xff0c;同时删除该星号字符左边一个字典序 最小 的字符。如果有多个字典…

ENSP静态路由实验 10.11

0x01 拓扑图 0x02 配置各接口和PC1、2的IP地址 PC1&#xff1a; PC2&#xff1a; AR1&#xff1a; 配置AR1&#xff0c;改名为R1&#xff0c;并配置各接口IP&#xff0c;随后保存。 <R1>system-view [Huawei]sysname R1 [R1]int g0/0/2 [R1-GigabitEthernet0/0/2]ip ad…

Golang | Leetcode Golang题解之第456题132模式

题目&#xff1a; 题解&#xff1a; func find132pattern(nums []int) bool {candidateI, candidateJ : []int{-nums[0]}, []int{-nums[0]}for _, v : range nums[1:] {idxI : sort.SearchInts(candidateI, 1-v)idxJ : sort.SearchInts(candidateJ, -v)if idxI < idxJ {ret…

短剧小程序短剧APP在线追剧APP网剧推广分销微短剧小剧场小程序集师知识付费集师短剧小程序集师小剧场小程序集师在线追剧小程序源码

一、产品简介功能介绍 集师专属搭建您的独有短剧/追剧/小剧场小程序或APP平台 二、短剧软件私域运营解决方案 针对短剧类小程序的运营&#xff0c;以下提出10条具体的方案&#xff1a; 明确定位与目标用户&#xff1a; 对短剧类小程序进行明确定位&#xff0c;了解目标用户群体…

go发送邮件:在Go语言中实现发邮件的教程?

go发送邮件的教程指南&#xff1f;怎么使用Go语言发送电子邮件&#xff1f; Go语言&#xff0c;作为一种简洁、高效且并发性强的编程语言&#xff0c;自然也提供了丰富的库来支持邮件发送功能。AokSend将详细介绍如何在Go语言中实现发送邮件的功能&#xff0c;帮助你快速掌握这…

微信小程序和抖音小程序的分享和广告接入代码

开发完成小程序或者小游戏之后&#xff0c;我们为什么要接入分享和广告视频功能&#xff0c;主要原因有以下几个方面。 微信小程序和抖音小程序接入分享和广告功能主要基于以下几个原因&#xff1a; 用户获取与增长&#xff1a;分享功能可以帮助用户将小程序内容传播给更多人&…

垂直分库分表、水平分库分表

垂直分库&#xff1a;分出来的数据库的结构完全不一样&#xff0c;垂直分库&#xff0c;更像单体项目到问服务项目过度&#xff0c;根据业务拆分多个模块&#xff0c;每个模块把数据单独抽离出来作为数据库&#xff0c;垂直分库就是根据不同的表业务放在不同放数据库里&#xf…

小程序项目实践(一)--项目的初始化以及前期的准备工作

目录 1.起步 1.1 uni-app 简介 1.2 开发工具 1.2.1 下载 HBuilderX 1.2.2 安装 HBuilderX 1.2.3 安装 scss/sass 编译 1.2.4 快捷键方案切换 1.2.5 修改编辑器的基本设置 1.3 新建 uni-app 项目 1.4 目录结构 1.5 把项目运行到微信开发者工具 1.6 使用 Git 管理项目 …

ViT模型技术学习

前言 最近多模态模型特别火&#xff0c;模型也越来越小&#xff0c;MiniCPM-2.6只有8B&#xff0c;里面采用的图片编码器是SigLipViT模型&#xff0c;一起从头学习ViT和Transformer&#xff01;本文记录一下学习过程&#xff0c;所以是自上而下的写&#xff0c;从ViT拆到Trans…

cmd设置文件夹共享和清除磁盘的只读属性

背景&#xff1a;备份vm虚拟机到新上架的IBM交换机服务器 备份方法&#xff1a;设置服务器D:\盘为共享&#xff0c;再在其他机器通过IP地址共享路径访问服务器D:\盘&#xff0c;进行复制备份 交换机服务器操作系统&#xff1a;Microsoft hyper-v server 2016英文版&#xff0…

k3s安装指定版本以及离线安装(docker)

首先下载你所需要版本的k3s安装包&#xff0c;目录结构如下所示&#xff0c;我这里是v1.19.15k3s2。 1.首先赋予可执行权限后进行安装。 # k3s 需要赋予可执行权限 sudo chmod x k3s sudo chmod x k3s-install.sh2.然后将k3s的二进制文件复制到/usr/local/bin/ cp k3s /us…

【测试用例设计】一个登录界面的测试用例设计

文章目录 1. 登录页面的测试用例设计 1. 登录页面的测试用例设计

2024 好玩有趣的nc(netcat)瑞士军刀,可以玩的对话工具哦!超级简单,包会,图文讲解,不讲虚话

一、nc是什么&#xff1f; 在Linux系统中&#xff0c;nc&#xff08;即netcat&#xff09;是一个非常强大的网络工具&#xff0c;常被昵称为“瑞士军刀”。它能够通过TCP或UDP协议读写网络连接&#xff0c;被广泛应用于网络调试和检测。 二、nc具体怎么进行通讯呢&#xff1f;&…

通信工程学习:什么是RIP路由信息协议

RIP&#xff1a;路由信息协议 RIP&#xff08;Routing Information Protocol&#xff09;路由信息协议是一种基于距离矢量算法的内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于在自治系统&#xff08;AS&#xff09;内部进行路由信息的交换和传播。以下是关于RI…

【机器学习】随机森林算法(看我以弱博强)

目录 算法引入&#xff1a; 算法介绍&#xff1a; 1. 集成学习&#xff1a; 2. 训练过程&#xff1a; 3. 分类和回归&#xff1a; 算法优点&#xff1a; 算法缺点&#xff1a; 算法实现&#xff1a; 1. 数据准备 2. 划分数据集 3. 创建随机森林模型 4. 训练模型 5…

Python和C++的差异在哪里

1.编程应用领域 C&#xff1a;广泛应用于系统级开发、嵌入式系统、游戏开发等领域。C的底层控制和高性能使其成为这些领域的理想选择。 Python&#xff1a;广泛应用于数据科学、Web开发、人工智能等领域。Python的简洁语法和强大库支持使其成为这些领域的首选语言。 2.语法风…

代码随想录 (三)—— 哈希表部分刷题

当我们想使用哈希法来解决问题的时候&#xff0c;我们一般会选择如下三种数据结构。 数组set &#xff08;集合&#xff09;map(映射) 在java中有就是&#xff0c;hashmap, LinkedHashMap, TreeMap &#xff0c;HashTable 等 总结一下&#xff0c;当我们遇到了要快速判断一个…

vue-scrollto实现页面组件锚点定位

文章目录 前言背景操作指南安装及配置步骤vue组件中使用 参考文章 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&#xff1a;Java后端、大数据…

处理 Vue3 中隐藏元素刷新闪烁问题

一、问题说明 页面刷新&#xff0c;原本隐藏的元素会一闪而过。 效果展示&#xff1a; 页面的导航栏通过路由跳转中携带的 meta 参数控制导航栏的 显示/隐藏&#xff0c;但在实践过程中发现&#xff0c;虽然元素隐藏了&#xff0c;但是刷新页面会出现闪烁的问题。 项目源码&…

现代 C++ 模板教程 学习笔记

现代C模板教程 看了这个教程&#xff0c;自己记录一些内容&#xff0c;不一定靠谱。 为什么需要模板&#xff1f;简单来说就是为了少写点重复的代码&#xff0c;让编译器自动帮我们生成。为了少写点函数&#xff0c;就有了函数模板&#xff0c;为了少写点类&#xff0c;就有了…