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

news2024/12/22 11:19:27

目录

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以示结束

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何快速给word文件加拼音?请跟着步骤完成吧

如何快速给word文件加拼音&#xff1f;在日常工作中&#xff0c;我们时常会遇到需要为Word文件中的文字添加拼音的情况&#xff0c;这尤其在教育、出版或国际交流等领域显得尤为重要。为文字配上拼音&#xff0c;不仅能帮助学习者准确发音&#xff0c;还能提升文档的可读性和普…

3.6.xx版本SpringBoot创建基于Swagger接口文档

介绍 基于Swagger构建的JavaAPI文档工具&#xff0c;实现后端功能的测试&#xff0c;并撰写API接口文档。 方法 pom.xml中引入依赖,要注意的是&#xff0c;本依赖使用的SpringBoot版本为3.6.xx <!--Knife4j--><dependency><groupId>com.github.xiaoymin<…

W25Q64学习 非易失性存储器

嵌入式开发之Nand-Flash和Nor-Flash的区别_nand flash谁定义的-CSDN博客 w25q64是nor FLash 用SPI通信 W25Q64模块硬件电路&#xff0c;这里的HOLD,WP功能都没用到 对于w25q64整个存储空间&#xff0c;划分为128个块&#xff0c;对于每个块&#xff0c;划分为16个扇区&#…

【python实操】python小程序之如何使用私有公有属性和方法

引言 python小程序之如何使用私有公有 文章目录 引言一、如何使用私有公有属性和方法1.1 题目1.2 代码1.3 代码解释1.3.1 逐行解释1.3.1 代码行为总结 二、思考2.1 名称修饰2.2 总结 一、如何使用私有公有属性和方法 1.1 题目 如何使用私有公有属性、方法 1.2 代码 class P…

Python快速编程小案例——打印蚂蚁森林植树证书

提示&#xff1a;&#xff08;个人学习&#xff09;&#xff0c;案例来自工业和信息化“十三五”人才培养规划教材&#xff0c;《Python快速编程入门》第2版&#xff0c;黑马程序员◎编著 蚂蚁森林是支付宝客户端发起“碳账户”的一款公益活动:用户通过步行地铁出行、在线消费等…

华为云应用侧Android Studio开发

本文将介绍如何使用AndroidStudio开发APP完成与接入华为云IoTDA设备的对接&#xff0c;包括属性参数获以及取命令下发。 一、鉴权认证 应用侧需要通过IAM服务鉴权&#xff0c;获取token&#xff0c;华为账号创建 IAM 用户&#xff0c; 可以为创建的用户分配权限 认证鉴权_设…

开源全文搜索(搜索引擎)

吃水不忘挖井人&#xff0c;介绍Doug Cutting大牛是十分有必要的。 最早&#xff0c;接触到搜索引擎&#xff0c;知道有个Nutch&#xff08;开源搜索引擎&#xff09;&#xff0c;于是开始查看Nutch相关的资料&#xff0c;发现了Nutch的创始人Doug Cutting&#xff0c;随着项目…

Python 如何使用 Redis 作为缓存

Python 如何使用 Redis 作为缓存 一、引言 在现代 Web 应用程序和数据密集型服务中&#xff0c;性能 和 响应速度 是至关重要的因素。而当应用需要频繁访问相同的数据时&#xff0c;直接从数据库获取数据会耗费大量的时间和资源。因此&#xff0c;缓存系统成为了提升性能的重…

做一只由 OpenCV 控制的仿生手

这个项目介绍了如何制作和控制一只仿生手。作者最初受到Instagram上一个视频的启发&#xff0c;该视频展示了使用MPU6050传感器追踪手部动作并在屏幕上显示3D模型。作者决定将这个想法进一步发展&#xff0c;使用OpenCV来控制一只真实的仿生手。 大家好&#xff0c;在这篇教程中…

强大的PDF到Word转换工具

Solid Converter&#xff1a;强大的PDF到Word转换工具推荐 在日常工作和学习中&#xff0c;PDF是最常用的文件格式之一。然而&#xff0c;编辑PDF文档并不总是那么方便&#xff0c;尤其是当你需要将PDF文件转换为Word文档时。Solid Converter 是一款强大的工具&#xff0c;专为…

SpringBoot美发门店系统:数据驱动的决策

3系统分析 3.1可行性分析 通过对本美发门店管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本美发门店管理系统采用SSM框架&#xff0c;JAVA作为开发语…

7.并发编程之并发安全问题

1 线程安全性 什么是线程安全性&#xff1f;可以这么理解&#xff0c; 我们所写的代码在并发情况下使用 时&#xff0c;总是能表现出正确的行为&#xff1b;反之&#xff0c;未实现线程安全的代码&#xff0c;表现的行为是不可预知的&#xff0c;有可能正确&#xff0c;而绝大多…

九寨沟,智慧旅游新名片

九寨沟属于自然类景区&#xff0c;以优美的自然风光取胜&#xff0c;景区文化内涵相对缺失。智慧化和文旅融合是智慧文旅景区的两个必备条件&#xff0c;九寨沟在智慧文旅景区建设过程中&#xff0c;经历了两个阶段&#xff0c;先是从传统景区迈向智慧景区&#xff0c;然后是充…

PostgreSQL学习笔记六:模式SCHEMA

模式&#xff08;Schema&#xff09; PostgreSQL中的模式&#xff08;Schema&#xff09;是一个命名的数据库对象集合&#xff0c;包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象&#xff0c;使得同一个数据库中可以包含…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦

MedMamba代码解释及用于糖尿病视网膜病变分类

MedMamba原理和用于糖尿病视网膜病变检测尝试 1.MedMamba原理 MedMamba发表于2024.9.28&#xff0c;是构建在Vision Mamba基础之上&#xff0c;融合了卷积神经网的架构&#xff0c;结构如下图&#xff1a; 原理简述就是图片输入后按通道输入后切分为两部分&#xff0c;一部分走…

每日论文18-24ISCAS采用磁调谐变压器低温CMOS28GHzVCO

《28 GHz VCO Using Magnetically Tuning Trifilar Transformer in Cryogenic CMOS Application 》24ISCAS 瞟到了这篇文章&#xff0c;开关真的是可以加在任何地方哈哈哈&#xff0c;还挺特别 通过改变电感偏压来改变Var的偏压&#xff0c;来拓宽带宽&#xff0c;其实是个挺简…

processing像素画教程

前提&#xff1a;各位已经安装了processing 第一步&#xff1a;创建一个简单的网格 我们首先创建一个网格来定义我们作品的像素画布。网格将帮助您在适当的位置绘制每个像素。 int gridSize 20; // 每个像素的大小 int cols, rows; void setup() {size(400, 400); // 设置画…

k8s 的网络通信

目录 1 k8s通信整体架构 2 flannel 网络插件 2.1 flannel 插件组成 2.2 flannel 插件的通信过程 2.3 flannel 支持的后端模式 3 calico 网络插件 3.1 calico 简介 3.2 calico 网络架构 3.3 部署 calico 1 k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较…

QTableView加入小灯泡

通过重载QAbstractTableModel中的data方法 QVariant CTblModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); int col index.column(); if (col ledColIndex && role Qt::DecorationRole) { return Q…