【C++ Primer Plus学习记录】简单文件输入/输出

有时候,通过键盘输入并非最好的选择。例如,假设您编写了一个股票分析程序,并下载了一个文件,其中包含1000种股票的价格。在这种情况下,让程序直接读取文件,而不是手工输入文件中所有的值,将方便得多。同样,让程序将输出写入到文件将更为方便,这样可以得到有关结果的永久性记录。

1.文本I/O和文本文件

使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。不管目标数据类型是什么,输入一开始都是字符数据——文本数据。然后,cin对象负责将文本转换为其他类型。

本章讨论的文件I/O相当于控制台I/O,因此仅适用于文本文件。要创建文本文件,用于提供输入,可使用文本编辑器,如DOS中的EDIT、Windows中的“记事本”和UNIX/Linux系统中的vi或emacs。也可以使用字处理程序来创建,但必须将文件保存为文本格式。

源代码文件就属于文本文件。

可以使用文本编辑器来查看通过文本输出创建的文件。

2.写入到文本文件中

 下面来复习一些有关将cout用于控制台输出的基本事实,为文件输出做准备。

·必须包含头文件iostream。

·头文件iostream定义了一个用于处理输出的ostream类。

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

·必须指明名称空间std;例如,为引用元素cout和endl,必须使用编译指令using或前缀std::。

·可以结合使用cout和运算符<<来显示各种类型的数据。

文件输出与此及其相似

·必须包含头文件fstream。

·头文件fstream定义了一个用于处理输出的ofstream类。

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

·必须指明名称空间std;例如,为引用元素ofstream,必须使用编译指令using或前缀std::。

·需要将ofstream对象与文件关联起来。为此,方法之一是使用open()方法。

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

·可结合使用ofstream对象和运算符<<来输出各种类型的数据。

注意,虽然头文件iostream提供了一个预先定义好的名为cout的ostream对象,但您必须声明自己的ofstream对象,为其命名,并将其同文件关联起来。下面演示了如何声明这种对象:

ofstream outFile;  //outFile an ofstream object
ofstream fout;     //fout an ofstream object 

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

outFile.open("fish.txt");  //outFile used to write to the fish.txt file

char filename[50];
cin >> filename;   //user specifies a name
fout.open(filename);  //fout to read specified file

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

下面演示了如何使用这种对象:

double wt = 125.8;
outFile << wt;   //write a number to fish.txt

char line[81] = "Objects are closer than they apper.";
fout << line << endl;  //write a line of text

重要的是,声明一个ofstream对象并将其同文件关联起来后,便可以像使用cout那样使用它。所有可用于cout的操作和方法(如<<、endl和setf())都可用于ofstream对象(如前述示例中的outFile和fout)。

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

1.包含头文件fstream。

2.创建一个ofstream对象。

3.将该ofstream对象同一个文件关联起来。

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

程序清单6.15中的程序演示了这种方法。它要求用户输入信息,然后将这些信息显示到屏幕上,再将这些信息写入到文件中。读者可以使用文本编辑器来查看该输出文件的内容。

//6.15
#if 1
#include<iostream>
#include<fstream> //包含头文件fstream
using namespace std;

int main()
{
	char automobile[50];
	int year;
	double a_price;
	double d_price;

	ofstream outFile; //create object for output,声明一个文件输出对象
	outFile.open("carinfo.txt");//将上述对象与特定文件关联起来
	//在这里,该程序运行前,文件carinfo.txt并不存在。在这种情况下,方法open()将新建一个名为carinfo.txt的文件。
	//如果在运行该程序时,carinfo.txt已经存在,open()将首先截断该文件,即将其长度截短到零——丢弃原有的内容,然后将新的输出加入到该文件中。
	//打开文件用于接受输入时可能失败。例如,指定的文件可能已经存在,但禁止对其进行访问。因此细心的程序员将检查打开文件的操作是否成功。

	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;

//display information on screen with cout
	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;

//now do exact same things using outFile instead of cout
	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();
	//done with file,程序使用完该文件后,应该将其关闭,close()不需要使用文件名作为参数,这是因为outFile已经同特定的文件关联起来。
	//如果忘记关闭,程序正常终止时将自动关闭它

	system("pause");
	return 0;
}
#endif

 屏幕输出的是使用cout的结果。

该程序的可执行文件所在的目录,将有一个名为carinfo.txt的新文件(根据编译器的配置,该文件也可能位于其他文件夹),其中包含使用outFile生成的输出。

3.读取文本文件

 接下来介绍文本文件输入,它是基于控制台输入的。控制台输入涉及多个方面,下面首先总结这些方面。

·必须包含头文件iostream。

·头文件iostream定义了一个用于处理输入的istream类。

·头文件iostream声明了一个名为cin的istream变量(对象)。

·必须指明名称空间std;例如,为引用元素cin,必须使用编译指令using或前缀std::。

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

·可以使用cin和get()方法来读取一个字符,使用cin和getline()来读取一行字符。

·可以结合使用cin和eof()、fail()方法来判断输入是否成功。

·对象cin本身被用作测试条件时,如果最后一个读取操作成功,它将被转移为布尔值true,否则被转换为false。

文件输入与此及其相似

·必须包含头文件fstream。

·头文件fstream定义了一个用于处理输入的ifstream类。

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

·必须指明名称空间std;例如,为引用元素ifstream,必须使用编译指令using或前缀std::。

·需要将ifstream对象与文件关联起来。为此,方法之一是使用open()方法。

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

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

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

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

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

注意,虽然头文件iostream提供了一个预先定义好的名为cin的istream对象,但您必须声明自己的ifstream对象,为其命名,并将其同文件关联起来。下面演示了如何声明这种对象:

ifstream inFile;   //inFile an ifstream object
ifstream fin;      //fin an ifstream object

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

inFile.open("bowling.txt");   //inFile used to read bowling.txt file

char filename[50];
cin >> filename;   //user specifies a name
fin.open(filename);  //fin used to read specified file

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

下面演示了如何使用这种对象:

double wt;
inFile >> wt;  //read a number from bowling.txt

char line[81];
fin.getline(line,81);  //read a line of text

重要的是,声明一个ifstream对象并将其同文件关联起来后,便可以像使用cin那样使用它。所有可以用于cin的操作和方法都可用于ifstream对象(如前述示例中的inFile和fin)。

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

inFile.open("bowling.txt");

if(!inFile.is_open())
{
   exit(EXIT_FAILURE);
}

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

程序清单6.16中的程序打开用户指定的文件,读取其中的数字,然后指出文件中包含多少个值以及它们的和与平均值。

//6.16
#if 1
#include<iostream>
#include<fstream>
#include<cstdlib>   //support for exit()
using namespace std;
const int SIZE = 60;

int main()
{
	char filename[SIZE];
	ifstream inFile;   //object for hangding file input

	cout << "Enter name of data file: ";
	cin.getline(filename, SIZE);
	inFile.open(filename);   //associate inFile with a file
	//检查文件是否被成功打开
	if (!inFile.is_open())   //failed to open file
	{
		cout << "Could not open the file " << filename << endl;
		cout << "Program terminating.\n";
		exit(EXIT_FAILURE);
	}
	double value;
	double sum = 0.0;
	int count = 0;   //number of items read 

	inFile >> value;  //get first value
	while (inFile.good())   //while input good and not at EOF
	{
		++count;  //one more item read
		sum += value;  //calculate running total
		inFile >> value;  //get next value
	}
	if (inFile.eof())
		cout << "End of file reached.\n";
	else if (inFile.fail())
		cout << "Input terminnated by data missmatch.\n";
	else
		cout << "Input terminated for unknown reason.\n";
	if (count == 0)
		cout << "No data processed.\n";
	else
	{
		cout << "Item read: " << count << endl;
		cout << "Sum: " << sum << endl;
		cout << "Average: " << sum / count << endl;
	}
	inFile.close();

	system("pause");
	return 0;
}
#endif

要运行程序清单6.16中的程序,首先必须创建一个包含数字的文本文件。为此,可以使用文本编辑器(如用于编写代码的文本编辑器)。假设该文件名为scores.txt,包含的内容如下:

18 19 18.5 13.5 14

16 19.5 20 18 12 18.5

17.5

程序还必须能找到这个文件。通常,除非在输入的文件名中包含路径,否则程序将在可执行文件所属的文件夹中查找。

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

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

相关文章

2024大广赛Canva可画都有哪些命题?

大广赛官网在3月8日发布了2024年Canva可画的命题&#xff0c;Canva可画是全球领先的视觉传播平台&#xff0c;2013年诞生于悉尼&#xff0c;2018年进入中国市场。秉承“赋予世界设计的力量”的使命&#xff0c;Canva可画为用户提供零门槛的设计编辑工具(网页端/App/小程序)&…

矢量图片转换软件Vector Magic mac中文版功能特色

Vector Magic mac中文版是一款非常流行的矢量图片转换软件&#xff0c;它的功能特色主要体现在以下几个方面&#xff1a; 首先&#xff0c;Vector Magic mac中文版拥有出色的矢量转换能力。它采用世界上最好的全彩色自动描摹器&#xff0c;能够将JPG、PNG、BMP和GIF等位图图像…

【C语言程序设计】C语言求圆周率π(三种方法)

题目一&#xff1a; 利用公式①计求π的近似值&#xff0c;要求累加到最后一项小于10^(-6)为止。 程序代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){float s1;float pi0;float i1.0;float n1.0;while(fabs(i)&…

利用ffmpeg对两个音频文件进行混音处理

前言 最近&#xff0c;拿到了一个语音识别程序&#xff0c;想测试一下它识别的准确性。原本程序有一段自己的测试音频&#xff0c;准确性还可以&#xff0c;但是&#xff0c;自己想增加一下测试素材的复杂性。想到了在原本的测试音频中引入干扰数据&#xff08;噪点&#xff…

Policy Gradient Methods

Policy Gradient Methods 是一类直接对策略本身进行参数化并优化的强化学习算法。与基于值函数的方法&#xff08;如 Q-Learning 和其变种 DQN&#xff09;不同&#xff0c;策略梯度方法直接学习一个参数化策略&#xff0c;该策略指定了在给定状态下选择每个动作的概率。这些方…

沙发3d模型制作过程---模大狮模型网

制作沙发的3D模型通常需要经历以下步骤&#xff1a; 概念设计&#xff1a; 首先&#xff0c;根据设计师或客户的需求&#xff0c;进行概念设计。这包括通过手绘草图或数字绘图软件创建初始设计概念。 建模&#xff1a; 使用专业的3D建模软件(例如Blender、Maya、3ds Max)进行建…

jeecgboot 开放页面权限,免登录访问

前端需要配置路由和添加白名单 1、配置路由 2、 在permission.js里&#xff0c;把刚才的路由添加到白名单 3、 后端需要把该页面涉及到的接口排除权限拦截 比如我这个页面涉及到两个接口&#xff1a; 那么就在后端的excludeUrls把这两个接口加进去。 前端后端都设置好了&…

解决vue项目,运行npm install安装报缺少c++库问题

项目是前后端分离架构&#xff0c;前端使用的是vue框架&#xff0c;在部署前端项目时&#xff0c;需要下载安装一些基础的镜像配置&#xff0c;包括一些预处理&#xff0c;但是在使用npm install和yarn install命令时出现了如下错误&#xff0c;查阅资料总结如下&#xff1a; …

你的隐私堪忧!彻底清空磁盘,只需要1行Python代码

大家好&#xff0c;这是程序员晚枫。 今天给大家分享Python自动化办公的第81个功能&#xff1a;彻底抹除磁盘的使用记录。 使用场景 哪怕你不是明星&#xff0c;每次换电脑的时候&#xff0c;也会很头疼硬盘里的数据怎么彻底删除。 因为只是简单的右键删除&#xff0c;市面…

Linux 安装 Gitblit

1.下载Gitblit 官网地址&#xff1a;Gitblit&#xff0c;目前最新的是1.9.3 2.上传到服务器 ①在服务器上新建目录&#xff1a;/usr/local/gitblit ②将下载的文件上传到服务器&#xff1a;/usr/local/gitblit/gitblit-1.9.3.tar.gz ③解压文件&#xff1a; cd /usr/local…

vue3学习(更新中)

目录 创建一个vue应用编写APP组件main.tsAPP.vue setupref和reactiverefreactive toRefs和toReftoRefstoRef computedwatch和watchEffect标签的ref属性ts接口范型-自定义类型props的使用生命周期pina搭建pina环境存储读取数据 创建一个vue应用 npm create vuelatest 编写APP组…

【Java核心能力】高并发在简历上如何体现?

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

力扣大厂热门面试算法题 12-14

12. 整数转罗马数字&#xff0c;13. 罗马数字转整数&#xff0c;14. 最长公共前缀&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.11 可通过leetcode所有测试用例。 目录 12. 整数转罗马数字 解题思路 完整代码 Java Pytho…

​LeetCode解法汇总1261. 在受污染的二叉树中查找元素

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给出一个满足下述规则的二叉树&#xff1…

基于SpringBoot的“医院信管系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“医院信管系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 功能结构图 系统首页界面图 用户注册界面图 医生…

基于Android的教学课程系统设计与开发

摘 要 移动应用已经成为人们生活必不可缺的一部分&#xff0c;大学生身为移动应用的最大用户群体&#xff0c;在生活学习娱乐各个方面都与移动应用有着紧密联系&#xff0c;然而针对大学生校园学习的移动应用却寥寥无几&#xff0c;因为不同的学校&#xff0c;甚至不同的院系&…

java guide 八股

Java语言特点 简单易学、面向对象&#xff08;继承、封装、多态&#xff09;、平台无关性&#xff08;Java虚拟机jvm&#xff09;、支持多线程、可靠、安全、高效、支持网络编程、编译与解释共存 JVM&#xff1a;Java虚拟机&#xff08;跨平台的关键&#xff09; JRE&#xff…

【maven下载、安装、配置教程】

一、下载 maven 官网&#xff1a;Maven – Download Apache Maven 注意&#xff1a;idea 和 maven 的版本问题&#xff0c;不然 idea 启动项目会发生兼容性错误。如 2020 版本 idea 支持 3.6.3 左右的 maven 版本&#xff0c;用 3.9版本的 maven 会报错。 二、配置maven全局配置…

探索AI时代“芯”路径 软通动力子公司鸿湖万联助阵第八届瑞芯微开发者大会

3月7日-8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;在福州成功举办&#xff0c;大会以“AI芯片AI应用AloT”为主题&#xff0c;通过芯片应用及生态伙伴的技术展示、产品和技术论坛等系列活动串联&#xff0c;吸引数千名开发者、合作伙伴以及行业专…

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip&#xff0c;zcat/zmore/zless/zgrepbzip2&#xff0c;bzcat/bzmore/bzless/bzgreppxz&#xff0c;xzcat/xzmore/xzless/xzgrepgzip&#xff0c;bzip2&#xff0c;xz压缩时间对比打包命令&#xff1a;tar打包命令…