文件操作详解(二)

目录

  • 一.文件的顺序读写
    • 1.顺序读写函数(适合于所有的流)
      • 1.1 fgetc(读字符)
      • 1.2 fputc(写字符)
      • 1.3 fgets(读字符串)
      • 1.4 fput(写字符串)
      • 1.5 fscanf(格式化地读)
      • 1.6 fprintf(格式化地写)
    • 2.顺序读写函数(只适用于文件流)
      • 2.1 fread(二进制地读)
      • 2.2 fwrite(二进制地写)
  • 二.scanf、fscanf、sscanf的对比
  • 三.printf、fprintf、sprintf的对比

一.文件的顺序读写

1.顺序读写函数(适合于所有的流)

1.1 fgetc(读字符)

一个字符一个字符地读
在这里插入图片描述
int fgetc(FILE* stream)
从文件中读(拿)字符
参数是文件指针
返回值是字符(转为了ASCII码值)
如果读取成功,返回的是ASCII码值 - char
如果读取错误,返回的是EOF(-1)

如果返回值类型是char,那么返回值肯定不等于-1(EOF),这样就没有返回错误与读到文件末尾了

int main()
{
	FILE* pf = fopen("test.txt", "r");
	//以读的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//不为NULL,使用
	char ch = 0;
	while ((ch = fgetc(pf))!= EOF)
	//fgetc读一个字符,光标就往下走一个字符
	//读到文件末尾,返回EOF
	{
		printf("%c\n", ch);
	}

	fclose(pf);
	//关闭文件
	pf = NULL;
	//文件指针不用了,置为空指针

	return 0;
}

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

1.2 fputc(写字符)

在这里插入图片描述
int fputc(int character,FILE* stream)
将字符一个一个地写入文件流中
第一个参数是要写入文件中的字符
第二个参数是文件流

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	for (char i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);
		//把a到z的字符都写入文件中
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

1.3 fgets(读字符串)

char* fgets(char* str,int num,FILE* stream)
第一个参数是从文件流中读出的字符串
第二个参数是重文件流中要读出的字符个数
第三个参数是文件流
如果读取错误或读到文件末尾返回NULL
如果读取成功返回str的起始地址
注意:
fgets会读num-1个字符,最后一位会留给\0(\0是自动放入的)
fgets只读一行,条件允许,把\n也读走

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读
	char str[20] = "xxxxxxxxxxxxxxx";
	fgets(str, 10, pf);
	printf("%s", str);

	fclose(pf);
	pf = NULL;

	return 0;
}


说明最后一位会自动补 \0

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读
	char str[20] = {0};
	fgets(str, 10, pf);
	printf("%s", str);

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
说明条件允许,把 \n 也读走了

在这里插入图片描述
在这里插入图片描述
说明fgets只读一行

1.4 fput(写字符串)

在这里插入图片描述
int fputs(const char* str,FILE* stream)
将str指向的字符串写入文件流中
如果写入成功返回一个整数
如果写入失败返回EOF
注意:
\n也会被写入文件中
不把\0写入文件中

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fputs("abcdef\n", pf);
	
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

1.5 fscanf(格式化地读)

int fscanf(FILE* stream,const char* format)
从指定的输入流(文件或键盘等)上读取格式化的数据
第二个参数是格式化的数据

struct s
{
	int a;
	char b;
	char arr[20];
}p;

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //读
	fscanf(pf, "%d %c %s", &(p.a), &(p.b), p.arr);

	//打印到屏幕上
	fprintf(stdout, "%d %c %s", p.a, p.b, p.arr);
	//stdout是标准输出流

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

1.6 fprintf(格式化地写)

int fprintf(FILE* stream,const char* str)
把数据以格式化的形式打印在指定的输出流(屏幕,文件等)上

struct s
{
	int a;
	char b;
	char arr[20];
}p;

int main()
{
	struct s p = { 18,'a',"zhangsan"};
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写

	fprintf(pf, "%d %c %s",p.a,p.b,p.arr);

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

2.顺序读写函数(只适用于文件流)

2.1 fread(二进制地读)

size_t fread(const void* str,size_t size,size_t count,FILE* stream);
第一个参数是指向数组的指针
第二个参数是每个元素的大小(以字节为单位)
第三个参数是元素个数

int main()
{
	FILE* pf = fopen("test.txt", "rb");
	// wb 以二进制的方式读出
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写数据
	int arr[10] = { 0 };
	/*fwrite(arr, sizeof(arr[0]), 6, pf);*/
	//以二进制的方式写入

	fread(arr, sizeof(arr[0]), 6, pf);
	//以二进制的方式读出
	for (int i = 0; i < 6; i++)
	{
		printf("%d ", arr[i]);
		//打印6个元素
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

2.2 fwrite(二进制地写)

size_t fwrite(const void* ptr,size_t size,size_t count,FILE* stream);
第一个参数是指向数组的指针
第二个参数是每个元素的大小(以字节为单位)
第三个参数是元素个数

int main()
{
	FILE* pf = fopen("test.txt", "wb");
	// wb 以二进制的方式写入
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写数据
	int arr[] = { 1,2,3,4,5,6 };
	fwrite(arr, sizeof(arr[0]), 6, pf);
	//以二进制的方式写入

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

二.scanf、fscanf、sscanf的对比

scanf – 从标准输入流(键盘)上读取格式化的数据
fscanf – 从指定的输入流(文件或键盘等)上读取格式化的数据
sscanf – 把字符串转为格式化的数据再读取(在字符串中读取格式化的数据)
int sscanf(const char* str,const char* format);

int main()
{
	struct s p = { 18,'a',"zhangsan" };
	char buf[200];
	//写
	sprintf(buf, "%d %c %s", p.a, p.b, p.arr);
	//将格式化的数据转为字符串,写入buf中
	printf("%s\n", buf);
	//打印字符串buf

	struct s t = { 0 };
	//读
	sscanf(buf, "%d %c %s", &(t.a), &(t.b), t.arr);
	//从buf中读(拿)字符串,将字符串转为格式化的数据
	printf("%d %c %s", t.a, t.b, t.arr);
	//打印格式化的数据

	return 0;
}

三.printf、fprintf、sprintf的对比

printf – 把数据以格式化的形式打印在屏幕上
fprintf – 把数据以格式化的形式打印到指定的输出流(例如屏幕,文件等)上
sprintf – 把格式化的数据转为字符串(将格式化数据写入字符串)
int sprintf(char* str,const char* format);

在这里插入图片描述

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

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

相关文章

jupyter Notebook 默认路径修改

1. anaconda prompt 中运行 jupyter notebook --generate-config 命令&#xff0c;将在 C:\Users\Think\.jupyter文件下生成 jupyter_notebook_config.py 文件。 2.在jupyter_notebook_config.py 文件中&#xff0c;找c.NotebookApp.notebook_dir 这个变量&#xff0c; (1)若…

2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现&#xff1a; 第二阶段问题   现在我们假设一个具体的环境。假设有一个凸多边形的区域&#xff0c;蜘蛛准备在这个区域&#xff08;或其一部分&#xff09;上结一张网。   问题一&#xff1a; 在区域的边界上安置有若干…

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计

区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示&#xff1a; (图中是只设置了20次迭代的预测结果&#xff0c;宽度较宽&#xff0c;可自行修改迭代参数&#xff0c;获取更窄的预测区间&#xff09; 注&am…

【chrome扩展】简 Tab (SimpTab)‘每日一句名言’样式

背景&#xff1a;最初参考“每日诗词”发现总是那几句&#xff0c;可以更换API接口完成“每日一句名言” 声明&#xff1a;本人不会ajax及ccs样式&#xff0c;非专业人士&#xff0c;借助CHATGPT代码生成完成。请友善交流。 每一句名言API: "https://api.xygeng.cn/open…

焦糖布丁理论:从用户任务角度重新审视产品价值

一、引言&#xff1a; 在竞争激烈的市场环境中&#xff0c;我们经常会遇到这样的困惑&#xff1a;为什么一款自认为极具创新和品质的产品&#xff0c;却未能获得市场的青睐和认可&#xff1f;焦糖布丁理论为我们提供了一个全新的视角&#xff0c;即”客户并非在购买产品本身&a…

gitlab代码迁移,包含历史提交记录、标签、分支

1、克隆现有的GitLab仓库&#xff08;http://localhost:8888/aa/bb/cc.git&#xff09;到本地&#xff0c;包括所有分支和标签 git clone --bare http://localhost:8888/aa/bb/cc.git 2、在gitlab上创建一个空的仓库&#xff08;http://localhost:7777/aa/bb/cc.git&#xff…

CAD Plant3D 2023 下载地址及安装教程

CAD Plant3D是一款专业的三维工厂设计软件&#xff0c;用于在工业设备和管道设计领域进行建模和绘图。它是Autodesk公司旗下的AutoCAD系列产品之一&#xff0c;专门针对工艺、石油、化工、电力等行业的设计和工程项目。 CAD Plant3D提供了一套丰富的工具和功能&#xff0c;帮助…

Spring Cloud微服务入门(一)

微服务的演变过程 //controller 视图交互层 前端数据处理传给service //1.DAO RequestBody userDAO String id;String type; {"id":"lcs", "type":"lcs"} //2.GET请求 findUserById&#xff1f;id1&typelcsRequestParam String …

电商大数据采集|电商API接口|自动化采集|人工采集

大数据采集是指从海量、异构、分散、动态的网络环境中收集、提取和存储数据的过程。大数据采集主要分为两种方式&#xff1a;自动化采集和人工采集。 1.自动化采集 电商API自动化采集是利用爬虫技术和API等方式&#xff0c;通过编写程序实现对网站或者应用程序中的数据进行自…

用户认证安全性测试

用户认证安全性测试 认证与会话管理认证--Authentication01 常见认证方式02 session认证Session Fixation攻击Session保持攻击 03 Token认证多因素认证session和token区别 04 暴力破解密码的那些事密码设置推荐策略 会话--Authorization 权限控制权限管理方式垂直权限管理水平权…

5.3.2 实验2:配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

界面控件DevExtreme JS ASP.NET Core 2024年度产品规划预览(一)

在本文中我们将介绍今年即将发布的v24.1附带的主要特性&#xff0c;这些特性既适用于DevExtreme JavaScript (Angular、React、Vue、jQuery)&#xff0c;也适用于基于DevExtreme的ASP.NET MVC/Core控件。 注意&#xff1a;本文中列出的功能和特性说明官方当前/预计的发展计划&a…

Jenkins--任务详解

一、任务类型 Jenkins的主要功能的实现是由执行任务去完成的&#xff0c;常用的任务类型主要有以下三种&#xff1a; 自由风格任务(Free Style Project): 这是Jenkins中最常用的任务类型&#xff0c;允许你自定义各种构建步骤和配置选项&#xff0c;如源码管理、构建触发器、…

【第十一届大唐杯全国大学生新一代信息通信技术大赛】赛题分析

赛道一 一等奖 7% 二等奖 15% 三等奖 25% 赛道二 参考文档&#xff1a; 《第十一届大唐杯全国大学生新一代信息通信技术大赛&#xff08;产教融合5G创新应用设计&#xff09;专项赛说明.pdf》 一等奖&#xff1a;7% 二等奖&#xff1a;10% 三等奖&#xff1a;20% 赛项一&am…

使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流

使用 Flume 将 CSV 数据导入 Kafka&#xff1a;实现实时数据流 文介绍了如何使用 Apache Flume 将 CSV 格式的数据从本地文件系统导入到 Apache Kafka 中&#xff0c;以实现实时数据流处理。通过 Flume 的配置和操作步骤&#xff0c;我们可以轻松地将数据从 CSV 文件中读取并发…

Django複習總結

①Django是框架。那麼什麼是框架&#xff1a; 框架很像是一個骨架&#xff0c;帶有很多默認器官的骨架。我們可以根據需要改寫、複寫這些器官。 從而實現自己所需要的功能。 ②Django是MVC模型\MVT模型&#xff1a; MVC模型&#xff1a;M&#xff1a;models模型層 V&#…

wireshark解析grpc/protobuf的方法

1&#xff0c;wireshark需要安装3.20以上 下载地址&#xff1a;https://www.wireshark.org/ 2&#xff0c;如果版本不对&#xff0c;需要卸载&#xff0c;卸载方法&#xff1a; sudo rm -rf /Applications/Wireshark.app sudo rm -rf $HOME/.config/wireshark sudo rm -rf /…

【信号处理】基于变分自编码器(VAE)的脑电信号增强典型方法实现(tensorflow)

关于 在脑电信号分析处理任务中&#xff0c;数据不均衡是一个常见的问题。针对数据不均衡&#xff0c;传统方法有过采样和欠采样方法来应对&#xff0c;但是效果有限。本项目通过变分自编码器对脑电信号进行生成增强&#xff0c;提高增强样本的多样性&#xff0c;从而提高最终…

【Layui】------ layui实现table表格拖拽行、列位置的示例代码

一、完整的示例代码&#xff1a;&#xff08;请使用layui v2.8.3的版本&#xff09;看懂就能用、不要照搬、照搬会出错误、拷贝重要代码改改符合你自己的需求。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

Camtasia Studio2024汉化版下载(功能强大的屏幕录制和视频编辑软件)

Camtasia Studio 2024是一款功能强大的屏幕录制和视频编辑软件&#xff0c;由TechSmith公司开发。这款软件不仅能够帮助用户轻松地记录电脑屏幕上的任何操作&#xff0c;还可以将录制的视频进行专业的编辑和制作&#xff0c;最终输出高质量的视频教程、演示文稿、培训课程等。 …