C++初学(19)

news2024/9/22 9:44:30

19.1、文本IO

如果你需要写入一千份以上的数据,如果手打那可太浪费时间了。这种情况下,应该让程序直接读取文件;同样的,让程序将输入写入到文件也是更加方便。

文本I/O的概念:使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。无论目标数据类型是什么,输入一开始都是文本数据,然后cin对象再将这些文本转换为其他类型。对于输出,将执行相反的转换。即整数被转换为数字字符序列,浮点数被转换为数字字符和其他字符组成的字符序列。

19.2、写入到文本文件中

我们这里复习一下cout用于控制台输出的东西:

(1)必须包含头文件iostream

(2)头文件iostream定义了用处理输出的ostream类

(3)头文件iostream声明了一个名为cout的ostream变量(对象)

(4)必须指明名称空间std;为了引用cout和endl,必须使用编译指令using或者前缀std::

(5)可以结合使用cin和运算符>>来读取各种类型的数据

文件输出与此极其相似:

(1)必须包含头文件fstream

(2)头文件fstream定义了一个用于处理输出的ofstream类

(3)需要声明一个或多个ofstream变量(对象),并以自己喜欢的方式对其进行命名,条件是遵守常用的命名规则

(4)必须指明名称空间std;为了引用元素ofstream,必须使用编译指令using或前缀std::

(5)需要将ofstream对象与文件关联起来,方法之一是open()方法

(6)使用完文件后,应使用close()方法将其关闭

(7)可结合使用ofstream对象和运算符<<来读取各种类型的数据

虽然头文件iostream提供了一个预先预定好的名为cout的ostream对象,但你必须声明自己的ofstream对象,为其命名,并将其同文件关联起来。

下面演示一下如何声明这些对象:

ofstream outFile;
ofstream fout;

下面演示如何将这种对象与特定的文件关联起来:

outFile.open("fish.txt");
char filename[50];
cin>>filename;
fout.open(filename);

方法open()结束一个C风格字符串作为参数,这可以是一个字面字符串,也可以是存储在数组中的字符串。

double wt=125.8;
outFile<<wt;
char line[80]="Objects are closer than they appear.";
fout<<line<<endl;

重要的是,声明一个ofstream对象并将其同文件关联起来后,便可以想使用cout那样使用它。所有可用于cout的操作方法都可以用于ofstream对象。

总之使用文件输出的主要步骤如下:

1、包含头文化fstream

2、创建一个ofstream对象

3、将爱ofstream对象同一个文件关联起来

4、像使用cout那样使用该ofstream对象。

下面这段程序演示了这种方法,它要求用户输入信息,然后将信息显示到屏幕上,再将这些信息写入到文件中:

#include <iostream>
#include <fstream>
int main()
{
	using namespace std;

	char automobile[50];
	int year;
	double a_price;
	double d_price;

	ofstream outFile;
	outFile.open("carinfo.txt");

	cout << "Enter the make and model of automobile: ";
	cin.getline(automobile, 50);
	cout << "Enter the model year: ";
	cin >> year;
	cout << "Enter the original asking price: ";
	cin >> a_price;
	d_price = 0.913 * a_price;

	cout << fixed;
	cout.precision(2);
	cout.setf(ios_base::showpoint);
	cout << "Make and model: " << automobile << endl;
	cout << "Year: " << year << endl;
	cout << "Was asking $" << a_price << endl;
	cout << "Now asking $" << d_price << endl;

	outFile << fixed;
	outFile.precision(2);
	outFile.setf(ios_base::showpoint);
	outFile << "Make and model: " << automobile << endl;
	outFile << "Year: " << year << endl;
	outFile << "Was asking $" << a_price << endl;
	outFile << "Now asking $" << d_price << endl;
	outFile.close();
	return 0;
}

屏幕输出是使用cout的结果,如果你查看该程序的可执行文件所在的目录,将看到一个名为carinfo.txt的新文本(也可能在其他文件夹里),查看后你会发现这些:

在程序里,声明一个ofstream对象后,便可以使用open()将该对象特定文件关联起来:

ofstream outFile;
outFile.open("carinfo.txt");

程序使用完文件后,应该将其关闭:

outFile.close();

注:close()方法不需要使用文件名作为参数,这是因为outFile已经同特定的文件关联起来。如果你忘记关闭文件,程序正常运行也会自动关闭它。

回到open()方法:

outFile.open("carinfo.txt");

在程序运行之前,文件carinfo.txt其实并不存在。在这种情况下,方法open()将新建一个名为carinfo.txt的文件。如果再次运行该程序将会发生什么?默认情况下,程序将截断该文件(即丢弃原有的文件),然后将的输出加到该文件中。打开文件可能会失败,例如指定文件已存在但禁止访问,后面会讲如何解决。

19.3、读取文本文件

文件输入其实与输出差不多:

(1)必须包含头文件fstream

(2)头文件fstream定义了一个用于处理输入的ifstream类

(3)需要声明一个或多个ifstream变量(对象),并以自己喜欢的方式对其进行命名,条件是遵守常用的命名规则

(4)必须指明名称空间std;为了引用元素ifstream,必须使用编译指令using或前缀std::

(5)需要将ifstream对象与文件关联起来,方法之一是open()方法

(6)使用完文件后,应使用close()方法将其关闭

(7)可结合使用ifstream对象和运算符>>来读取各种类型的数据

(8)可以使用ifstream对象和get()方法来读取一个字符,使用ifstream对象和getline()来读取一行字符

(9)可以结合使用ifstream和eof()、fail()等方法来判断输入是否成功

(10)ifstream对象本身被用作测试条件时,如果最后一个读取成功,它将被转换为布尔值true,否则被转换为false

与写入文本文件一样,也要声明自己的ifstream对象,为其命名,并将其同文件关联起来:

ifstream inFile;
ifstream fin;
inFile.open("bowling.txt");
char filename[50];
cin>>filename;
fin.open(filename);

如果试图打开一个不存在的文件用于输入,将导致后面使用ifstream对象进行输入时失败。检查文件是否被成功打开的首先方法是使用方法is_open(),因此我们可以使用以下代码:

inFile.open("bowling.txt");
if(!inFile.is_open())
{
   exit(EXIT_FAILURE);
}

如果文件被成功地打开,方法is_open()将返回true;如果文件没有被打开,表达式!inFile.is_open()将为true。函数exit()的原型是在头文件cstdlib中定义的,在该头文件中,还定义了一个用于同操作系统通信的参数值EXIT_FAILURE。函数exit()终止程序。

#include <iostream>
#include <fstream>
#include <cstdlib>
const int SIZE = 60;
int main()
{
	using namespace std;

	char filename[SIZE];
	ifstream inFile;
	cout << "Enter name of data file: ";
	cin.getline(filename,SIZE);
	inFile.open(filename);
	if (!inFile.is_open())
	{
		cout << "Could not open the file " << filename << endl;
		cout << "Program terminating." << endl;
		exit(EXIT_FAILURE);
	}
	double value;
	double sum = 0.0;
	int count = 0;
	inFile >> value;
	while (inFile.good())
	{
		++count;
		sum += value;
		inFile >> value;
	}
	if (inFile.eof())
		cout << "End of file reached." << endl;
	else if (inFile.fail())
		cout << "Input terminated by data mismatch." << endl;
	else
		cout << "Input terminated for unknown reason." << endl;
	if (count == 0)
		cout << "No data processd." << endl;
	else
	{
		cout << "Items read: " << count << endl;
		cout << "Sum: " << sum << endl;
		cout << "Average: " << sum / count << endl;
	}
	inFile.close();
	return 0;
}

要运行这个程序,首先必须创建一个包含数字的文本文件,我在电脑上新建一个文件名为Furina.txt,并包含以下数据:(当然最好放在同程序同一个文件夹里)

注:Windows文本文件的每行都以回车字符或者换行符结尾,有些文本编辑器不会自动在最后一行末尾加上换行符,因此最好在文本末尾按下回车键再保存。

该程序没有使用硬编码文件名,而是将用户提供的文件名存储到字符数组filename中,然后作为open()的参数。

正如前面所说,检查文件是否打开非常重要。读取文件有几点需要检查:首先,程序读取文件时不应超过EOF;其次程序可能遇到类型不匹配的情况,最后是文件受损或者硬件问题。

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

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

相关文章

【高阶数据结构】B树、B+树、B*树

B树、B树、B*树 1. 常见的搜索结构2. B树概念3. B树的插入分析4. B树的插入实现4.1 B树的节点设计4.2 B树的部分插入实现14.3 B树的查找4.4 B树的部分插入实现24.5 插入key的过程4.7 B树的插入完整代码4.8 B树的简单验证4.9 B树的删除4.10 B树的性能分析 5. B树6. B*树7. 总结8…

欧科云链OKLink受邀参与WebX ,旗下EaaS助力项目方“弯道超车”

8 月 27 日&#xff0c;作为亚洲顶级区块链行业盛会 WebX 的 side event 之一的 OKJ Night 在东京盛大拉开帷幕&#xff0c;会上正式宣布 OKCoin Japan 升级为 OKJ&#xff0c;进一步以合规的形式推动区块链产业在日蓬勃发展。日本首相为本次活动发来贺电。 OKLink 非常荣幸作为…

吹爆上海交大的大模型实战教程!!非常详细收藏我这一篇就够了

各位好&#xff0c;这里是DASOU 今天分享一个上海交大的免费的大模型课程&#xff0c;有相关教程文档和Slides&#xff0c;目前是1.6K星标&#xff0c;还是挺火的 项目动机 《动手学大模型》系列编程实践教程&#xff0c;由上海交通大学2024年春季《人工智能安全技术》课程&…

哈希基础概念即使用(C++)

目录 1. unordered系列关联式容器 1.1 unordered_map 1.1.1 unordered_map的文档介绍 1.1.2 unordered_map的接口说明 1. unordered_map的构造 2. unordered_map的容量 3. unordered_map的迭代器 4. unordered_map的元素访问 5. unordered_map的查询 6. unordered_map的修改操作…

为Jekyll站添加“相关文章“功能

想为本博客添加相关文章功能&#xff0c;因为本站是通过Jekyll搭建的静态站&#xff0c;所以首先想到通过Jekyll相关插件解决&#xff0c;没想到搜遍全网居然未找到可用的插件&#xff0c;无奈最后手敲实现&#xff0c;以下记录折腾过程。 全文详见个人独立博客&#xff1a;ht…

armbian cups 远程打印机 1022

使用 CUPS Web 浏览器界面设置和管理打印机 - Oracle Solaris 管理&#xff1a;常见任务 N1刷armbian变身打印服务器&#xff0c;支持全平台无线打印PC扫描_存储设备_什么值得买 (smzdm.com) 第 6 章 使用 Web 界面向 CUPS 添加打印机 | Red Hat Product Documentation apt…

poi中导入excel时,获取下拉选项、解析从子表引用的下拉选项

我们导入excel表&#xff0c;解析数据时&#xff0c;有的时候需要把单元格是下拉框的所有下拉项拿到&#xff0c;有的下拉项是直接在单元格里面添加的下拉列表&#xff0c;还有的下拉项则是从其它表引用过来的&#xff0c;如下图&#xff1a; 那我们要怎么读取这两种不同方式添…

Python 通过邮件合并(Mail Merge)批量生成Word文档

目录 使用工具 创建邮件合并模板 使用 Python 在 Word 中执行邮件合并 使用 Python 在 Word 中通过邮件合并一次性生成多个文档 使用 Python 获取 Word 中的合并域的名称 邮件合并是 Microsoft Word 中一项非常有用的功能&#xff0c;它让用户能够将事先设计好的模板与数据…

华为云征文 | 华为云Flexus云服务器X实例全面使用操作指南

文章目录 一、华为云Flexus云服务器X实例⛅华为云Flexus云服务器X实例特点☁️为什么选择华为云Flexus云服务器X实例&#xff1f;☀️基于业务负载&#xff0c;灵活调配产品价格 二、快速上手华为云Flexus云服务器X实例⚡注册华为云账号⌚进入Flexus云服务器X实例介绍页面⏰购买…

苹果手机怎么开定位?2个神操作,快速打开定位

网上一直流行着这样一句玩笑话&#xff1a;“出门不开定位导航&#xff0c;就会变成下一个失踪人口。” 这句话也从侧面反映出手机的定位服务对于大部分用户来说非常重要。那么&#xff0c;对于苹果用户来说&#xff0c;苹果手机怎么开定位呢&#xff1f;今天&#xff0c;小编…

利用固定窗口计数算法限流,精准控制第三方 API 调用频率

文章目录 使用场景使用固定窗口计数算法管理调用频率使用测试一秒钟执行五次适用场景 使用场景 在调用第三方 API 时&#xff0c;我们通常会在 API 文档中看到对接口访问频率的限制。为了确保不超出这些限制&#xff0c;使用限流算法来控制 API 调用频率是至关重要的。 在作为…

Spike-in:微生态16S扩增子绝对定量重磅上线!

16S扩增子测序是一种广泛应用于微生物群落分析的技术&#xff0c;主要用于研究环境样本中微生物的种类、丰度及其生态关系。 然而&#xff0c;传统的16S扩增子测序通常只能提供相对丰度数据&#xff0c;无法准确反映样本中各微生物的绝对数量&#xff0c;导致在一定程度上掩盖…

论文理解【LLM-agent】—— 【Reflexion】Language Agents with Verbal Reinforcement Learning

文章链接&#xff1a;Reflexion: Language Agents with Verbal Reinforcement Learning代码&#xff1a;GitHub - noahshinn/reflexion发表&#xff1a;NIPS 2023领域&#xff1a;LLM agent一句话总结&#xff1a;传统强化学习 Agent 通过和环境交互进行试错学习&#xff0c;但…

python-比身高

题目描述 班上有n个同学。现在同学们排成了一队&#xff0c;每个同学都想知道在自己前面有多少个同学比自己高。现在告诉你班上同学们排好队后每个同学的身高&#xff0c;请告诉每个人在他们前面有多少人比他们高。输入&#xff1a; 输入共两行。 第一行一个整数n。 第二行n个整…

实战|任意用户漏洞挖掘分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

变压器电压调节

电压调节是衡量变压器在不同负载条件下维持恒定次级电压的能力的标准&#xff0c;因为输出次级电压可能不是我们所期望的。 当变压器的初级绕组通电时&#xff0c;它会产生次级电压和电流&#xff0c;其量由变压器匝数比 (TR) 决定。如果单相变压器的降压匝数比为 2:1&#xf…

【论文阅读】一种针对多核神经网络处理器的窃取攻击(2020)

摘要 攻击者可以通过侧信道信息(Side-channel)完成模型窃取攻击[17]. [17] Hua W Z, Zhang Z R, Suh G E. Reverse Engineering Convolutional Neural Networks through Side-channel Information Leaks[C]. 2018 55th ACM/ESDA/IEEE Design Automation Conference (DAC), 2018…

Large Language Models(LLMs) Concepts

1、Introduction to Large Language Models(LLM) 1.1、Definition of LLMs Large: Training data and resources.Language: Human-like text.Models: Learn complex patterns using text data. The LLM is considered the defining moment in the history of AI. Some appl…

HMI触屏网关-VISION如何与Modbus TCP从机通信

上文&#xff1a;HMI触屏网关-VISION如何与Modbus RTU从机通信-CSDN博客 1. 硬件连接 Modbus TCP协议采用网口通信的方式&#xff0c;因此&#xff0c;只需要保证网关的LAN口IP和Modbus TCP从机的IP在同一网段即可。 Modbus TCP从机参数说明&#xff1a; 2. VISION创建Modbu…

怎么将ts格式转mp4?必须掌握的4种视频转换方法

当今&#xff0c;视频格式转换变得愈发重要。当我们面对不太常见的ts格式&#xff0c;想要将其转换为更通用的mp4时&#xff0c;掌握正确的转换方法尤为关键。今天&#xff0c;我们将分享4种实现ts格式转mp4的必备方法。每一种方法都有其独特优势&#xff0c;满足不同需求。 我…