首页 > 编程语言 >C++初学(19)

C++初学(19)

时间:2024-09-06 20:55:18浏览次数:13  
标签:文件 ifstream 19 C++ 对象 初学 ofstream open cout

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;其次程序可能遇到类型不匹配的情况,最后是文件受损或者硬件问题。

标签:文件,ifstream,19,C++,对象,初学,ofstream,open,cout
From: https://blog.csdn.net/2301_79654372/article/details/141728530

相关文章

  • C++入门基础(类和对象)
    7.类和对象1.面向对象和面向过程的区别面向对象:是将事务抽象成类和对象,以对象为中心,通过对象的交互实现程序的功能,可维护性强面向过程:是将复杂问题一步步拆分,通过依次执行来解决问题,可维护性比较弱2.类大小的计算1.内存对齐考虑内存对齐的默认大小vs默认是8字......
  • C++入门基础
    6.C++入门基础1.函数重载1.什么是函数重载函数重载是实现C++多态的一个重要技术,是在同一作用域内相同函数名因为参数的类型不同或者个数不同或者都不同构成重载2.C++是如何支持函数重载的1.命名改变根据对应的参数类名改成比如voidfoo(int)voidfoo(double)_fo......
  • 洛谷 P6419 [COCI2014-2015#1] Kamp
    洛谷P6419[COCI2014-2015#1]Kamp题意一颗树\(n\)个点,\(n-1\)条边,经过每条边都要花费一定的时间,任意两个点都是联通的。有\(K\)个人(分布在\(K\)个不同的点)要集中到一个点举行聚会。聚会结束后需要一辆车从举行聚会的这点出发,把这\(K\)个人分别送回去。请你回答,对......
  • 洛谷 P5658 [CSP-S2019] 括号树
    洛谷P5658[CSP-S2019]括号树题意给定一棵树,每个点有一个括号(或)。定义\(s_i\)表示根节点到\(i\)每个点的括号组成的序列。求每个\(s_i\)中合法括号子串的个数\(f_i\)。思路定义\(g_i\)表示\(s_i\)中以\(i\)结尾的合法括号子串的个数。有\(f_i=f_{fa_......
  • Modern C++——使用分支预测优化代码性能
    大纲[[likely]][[unlikely]]样例应用场景题外参考代码参考资料在C++20中,新引入了一对属性关键字[[likely]]和[[unlikely]],它们用于为编译器提供关于代码分支执行概率的额外信息,以帮助编译器进行更好的优化。这对属性是基于长期实践中开发人员对程序执行路径的深入理解......
  • 枚举: C++和Python实现鸡兔同笼问题
    作者制作不易,关注、点赞、收藏一下吧!目录1.Python实现2.C++实现1.Python实现首先,我们需要输入头和脚的数量:head=int(input("请输入头的数量:"))feet=int(input("请输入脚的数量:"))input()实现输入,int()实现把字符串型(str)换为整型(int)。然后,进行循环......
  • c++的面向过程与面向对象
    面向过程与面向对象面向过程:在编程时重点考虑如何解决问题,以及解决问题的具体步骤。面向对象:在编程时重点考虑的是"谁"能解决问题(类、结构),以及"它"解决问题时所需要属性(成员变量)和功能(成员函数)。抽象:把“解决问题者”当作思考或观察对象,把解决问题所需的具备的属性和功能......
  • c++的类和对象
    类和对象什么是类把抽象结果(利用面向对象的思维模式,思考、观察出的结果),使用用C++的语法封装出一种类似结构的自定义数据类型(复合数据类型)。如何设计类struct结构名{  成员函数;//结构的成员默认访问权限是public  成员变量;};​class类名{  成员......
  • 修复Microsoft Visual C++ 2015中msvcp140_ATOMIC_WAIT.dll缺失的5大策略
    在电脑使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp140_ATOMIC_WAIT.dll丢失”。这个错误提示通常出现在运行某些程序或游戏时,给使用者带来了很大的困扰。那么,如何解决这个问题呢?一,原因分析msvcp140_ATOMIC_WAIT.dll是MicrosoftVisualC++2015运行时库的一部......
  • C++常见知识掌握
    1.Linux软件开发、调试与维护内核与系统结构Linux内核是操作系统的核心,负责管理硬件资源,提供系统服务,它是系统软件与硬件之间的桥梁。主要组成部分包括:进程管理:内核通过调度器分配CPU时间给各个进程,实现进程的创建、调度、终止等操作。使用进程描述符(task_struct)来存储进程......