【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 filechar 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.txtchar 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 coutcout << 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 coutoutFile << 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 filechar 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.txtchar 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 inputcout << "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 valuewhile (inFile.good())   //while input good and not at EOF{++count;  //one more item readsum += value;  //calculate running totalinFile >> value;  //get next value}if (inFile.eof())cout << "End of file reached.\n";else if (inFile.fail())cout << "Input terminnated by data missmatch.\n";elsecout << "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

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

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

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

相关文章

惬意了解 —— 前端发展史

下拉底部&#xff0c;参与投票&#xff5e;&#xff5e; 前端发展史&#xff1a;从洪荒时代到现代 前端开发已经走过了将近20年的历程&#xff0c;从最早的纯静态页面到如今的现代前端框架&#xff0c;我们见证了前端技术的蓬勃发展。让我们一起回顾这段历史。 洪荒时代&…

深入联合文件系统

Union File System&#xff08;联合文件系统&#xff0c;UnionFS&#xff09;是一种轻量级的高性能分层文件系统&#xff0c;它支持将文件系统中的修改信息作为一次提交&#xff0c;并层层叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下&#xff0c;应用看到的…

2024年A特种设备相关管理(锅炉压力容器压力管道)证考试题库及A特种设备相关管理(锅炉压力容器压力管道)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;证考试题库及A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#…

不同的二叉搜索树 01背包

96.不同的二叉搜索树 力扣题目链接(opens new window) 给定一个整数 n&#xff0c;求以 1 ... n 为节点组成的二叉搜索树有多少种&#xff1f; dp[3] dp[2] * dp[0] dp[1] * dp[1] dp[0] * dp[2] dp[i] &#xff1a; 1到i为节点组成的二叉搜索树的个数为dp[i]。 dp[i] d…

Vivado2021及以下版本 HLS生成IP核报错的解决方案

摘要&#xff1a;生成 HLS ip的时候会报错&#xff0c;无法生成&#xff1b;原因是2021及以下的版本都会有时间错误的问题&#xff0c;所以要用官方的补丁包&#xff0c;但是打了补丁包有时候也会没用 一、打补丁 以下是xilinx提供的解决办法&#xff1a; Export IP Invalid …

振弦采集仪在岩土工程施工质量监控中的应用案例分析

振弦采集仪在岩土工程施工质量监控中的应用案例分析 河北稳控科技振弦采集仪是一种用来监测振动的仪器设备&#xff0c;可以通过采集振弦信号来分析结构的振动特性。在岩土工程施工质量监控中&#xff0c;振弦采集仪可以用于以下几个方面的应用。 1. 地基与基础工程监测&#…

11.Java---语法总结之一个小项目

图书管理系统 Java学习了很久了,今天将运用之前学习的所有东西整理做个小小的小项目. 1.首先是各种包和操作方法建好 2.然后是项目的大框架搭好 3.然后就开始实现各个部分了 看看最后的运行结果吧! 管理员测试 1.登录&显示图书的运行结果 2.查找&新增图书的运行结…

【黑马程序员】python函数

文章目录 函数什么是函数为什么学习函数函数定义函数的传入参数函数的返回值返回值基础None返回值 函数说明文档函数的嵌套调用定义代码示例 全局变量和局部变量全局变量global变量局部变量 函数综合案例 函数 什么是函数 组织好的&#xff0c;可重复使用的、用来实现特定功能…

图像分割损失函数

为什么要乘以2&#xff0c;是为了让DICE的值域在0和1之间 优化&#xff1a;两种LOSS相加 Focus loss:

【PLSQL】plsqldeveloper查询结果记录显示不全

plsql版本号为12或13。 例如scott用户的emp表中共有14条数据&#xff0c;但select * from emp;查询结构只显示13条记录&#xff0c;如下&#xff1a; 这是由于查询结果显示条数&#xff0c;根据查询框高度自动计算可以显示多少条记录&#xff0c;如果想显示全&#xff0c;则需…

阿里云领盲盒活动

阿里云每次的活动都很给力&#xff0c;实打实地发东西。 这次是体验 通义灵码 的活动&#xff0c;这个是体验的推广链接 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 我是在vscode安装的&#xff0c;体验还行&#xff0c;抽奖抽到了马克杯 这个是抽奖的具体步骤 https:…

程序猿成长之路之socket篇-socket通信原理简介

hello,各位小伙伴们大家好&#xff0c;上次以RSA加解密算法介绍作为密码学篇的结尾后&#xff0c;时光飞逝&#xff0c;转眼到了新一年的春季&#xff0c;这次将介绍一下socket通信和编程原理。 什么是socket&#xff08;套接字&#xff09;&#xff1f; socket&#xff08;套…

Matlab|【分布鲁棒】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法

目录 主要内容 1.1 主要难点-分布鲁棒优化 1.2 程序求解步骤-主子问题迭代 部分结果 下载链接 主要内容 本程序主要对《基于场景聚类的主动配电网分布鲁棒综合优化》-高海淑的方法复现&#xff0c;应用到综合能源电热微网方向&#xff0c;采用拉丁超立方抽样对不同…

[计算机效率] 在当前文件夹以管理员身份运行批处理

2.7 在当前文件夹以管理员身份运行批处理 这个功能对于要经常运行批处理程序的人来说真的很方便。每次要要运行批处理&#xff0c;要么就是直接打开的批处理不是以管理员身份运行的&#xff0c;要么就是在批处理中要一步步的切换进入到目标文件夹中&#xff0c;非常费时间。 方…

录屏直播技巧大揭秘,轻松捕捉精彩瞬间

录屏直播作为一种流行的线上内容创作方式&#xff0c;备受关注。无论是游戏主播、教程讲解还是线上会议&#xff0c;录屏直播都能轻松应对。本文将介绍三种录屏直播方法&#xff0c;并对其进行分步骤详细说明&#xff0c;帮助读者轻松掌握录屏直播的技巧&#xff0c;为内容创作…

c语言 线性搜索算法

线性搜索被定义为一种顺序搜索算法&#xff0c;从一端开始&#xff0c;遍历列表中的每个元素&#xff0c;直到找到所需的元素&#xff0c;否则搜索将继续&#xff0c;直到数据集的末尾。 线性搜索算法 线性搜索算法如何工作&#xff1f; 在线性搜索算法中&#xff1a; …

Linux VM虚拟环境 设置静态IP

目录 查看自己的网卡配置说明重启网卡实例测试配置情况测试网络 查看自己的网卡 ip a配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens32配置说明 [rootlinux-server ~]# cd /etc/sysconfig/network-scripts/ #网卡配置文件存放路径 [rootlinux-server network-scri…

凡得首席战略官蔡聪,将出席“ISIG-流程挖掘技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;RPA中国、AIGC开放社区、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索R…

开源导出html表格项目-easyHtml

开源导出html表格项目-easyHtml 背景介绍 背景 项目的由来&#xff0c;在面试的过程中&#xff0c;发现这个需求&#xff08;导出html表格&#xff09;比较常见&#xff0c;同时也引起我的兴趣&#xff0c;所以就有了开源项目easyHtml第一个版本 介绍 功能 支持自定义表格标…

【JavaScript 漫游】【035】同源限制

文章简介 本篇文章为【JavaScript 漫游】专栏的第 035 篇文章&#xff0c;记录了浏览器模型同源限制相关的知识点。 概述 浏览器安全的基石是“同源政策”&#xff08;same-origin policy&#xff09;。1995 年&#xff0c;该政策由 Netscape 公司引入浏览器。目前&#xff…