2.2.3 读/写文件
除了用设备进行输入/输出之外,更多的时候,程序需要跟文件进行数据的输入/输出,这时候我们就需要对文件进行读/写操作:从文件读取数据到应用程序进行处理;将数据写入文件进行保存。C++(www.cppentry.com)提供了两个类ofstream和ifstream以实现应用程序跟文件之间的数据交流。
ofstream和ifstream是由<fstream>头文件定义的两个类,分别负责数据的输出和输入。可以分别创建这两个类的对象,通过这些对象提供的函数打开文件,从而将对象跟某个具体的文件联系起来,再利用插入符"<<"和提取符">>"对这些对象进行操作。例如,下面这段程序使用ofstream和ifstream两个类实现文件的读/写:
- #include "stdafx.h"
- #include <iostream>
- // 引入输入/输出文件流对象需要的头文件
- #include <fstream>
-
- using namespace std;
- // 主函数
- int _tmain(int argc, _TCHAR* argv[])
- {
- // 定义变量,保存程序中的数据
- int nYear, nMonth, nDate;
- // 尝试打开Date.txt文件,并将其连接到输入文件流fin
- ifstream fin("Date.txt");
- // 如果成功打开Date.txt文件,则从文件中读取内容
- if( !fin.bad() )
- {
- // 忽略文件中第1行的提示信息
- fin.ignore(256,'\n');
- // 用提取符“>>”从文件输入流fin中读取记录的数据,并保存到相应的变量
- fin>>nYear>>nMonth>>nDate;
- // 将数据显示到屏幕
- cout<<"文件中的日期是"
- <<nYear<<"-"<<nMonth<<"-"<<nDate<<endl;
- // 读取完成后,关闭文件
- fin.close();
- }
- else
- {
- // 如果文件打开失败,则提示错误信息
- cout<<"无法打开文件并进行读取"<<endl;
- }
-
- // 提示用户输入新的数据并将其写入文件
- cout<<"请输入当前日期(年月日):"<<endl;
- // 从用户屏幕获取用户的键盘输入并保存到相应的变量中
- cin>>nYear>>nMonth>>nDate;
-
- // 尝试打开文件Date.txt,并将其连接到输出文件流fout中
- ofstream fout("Date.txt");
- // 如果成功打开Date.txt文件,则将用户输入的数据写入文件
- if( !fout.bad() )
- {
- // 利用插入符“<<”将数据写入文件输出流fout中,
- // 也就是将数据写入文件中
- fout<<"用户输入的当前日期是:\n"
- <<nYear<<" "<<nMonth<<" "<<nDate;
- // 写入完成后,关闭文件
- fout.close();
- }
- else
- {
- // 如果无法打开文件,则提示用户信息
- cout<<"无法打开文件并进行写入"<<endl;
- }
-
- return 0;
- }
在这段程序中,首先创建了一个输入文件流ifstream的对象fin,并利用它的构造函数将其连接到一个文本文件Date.txt。所谓构造函数,就是这个对象创建时所执行的函数。这里,使用"Date.txt"作为参数来调用这个构造函数,实际上就是使用这个文件创建fin对象。除此之外,还可以使用fin所提供的open()函数来打开一个文件。当利用fin成功打开一个文件之后,就可以利用提取符">>"从fin中提取各种数据。">>"会以空格为分隔符逐个从文件中读取数据,并将其保存到相应的数据变量中。例如,如果文件中的内容如下:
- 用户输入的当前日期是:
- 1983 7 3
默认情况下,fin总是从文件的开始部分进行读取的,为了直接读取第2行的内容,可以使用"fin.ignore(256,'\n');"忽略第1行的内容,将读取位置跳转到第2行。然后,通过提取符">>"将第2行用空格分割的三个数据分别提取并保存到三个变量中。
同样,为了将数据写入文件,需要创建一个输出文件流ofstream的对象fout,然后通过它的构造函数或open()函数来打开一个文件,将这个文件和fout对象连接起来,然后通过插入符"<<"将数据插入fout对象,这样就实现了将数据写入它所关联的文件中的目的。整个过程如图2-9所示。
|
| 图2-9 文件/读写 |
除了上面所介绍的文本文件的读/写之外,C++(www.cppentry.com)所提供的fstream还可以读/写二进制文件,甚至可以重新定义"<<"和">>",实现特殊的读/写操作。