目录
8.2 文件输入和输出
fstream头文件
头文件fstream定义了三个类型来支持文件IO:(1)ifstream从一个给定文件读取数据;(2)ofstream向一个给定文件写入数据;(3)fstream可以读写给定文件
fstream特有的操作
fstream特有的操作 | |
fstream fstrm | 创建一个未绑定的文件流 |
fstream fstrm(s) | 创建一个fstream,并打开名为s的文件。默认的文件模式mode依赖于fstream的类型 |
fstream fstrm(s,mode) | 与前一个构造函数类似,但按指定mode打开文件 |
fstrm.open(s) | 打开名为s的文件,并将文件与fstrm绑定,默认的文件mode依赖于fstream的类型,返回void |
fstrm.close() | 关闭与fstrm绑定的文件,返回void |
fstrm.is_open() | 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭 |
输出文件(写入文件)
写入文件的一般步骤:
(1)创建一个ofstream对象流,对象流都会定义一个open成员函数;
(2)将该对象与特定的文件关联起来,即关联一个文件:
(3)以使用cout的方式使用该对象流,唯一区别是输出将进入文件,而不是屏幕;
如下例子创建对象流和关联文件:
第一种方式,创建对象流时就关联文件,open函数会被自动调用:
ofstream out(file); //自动调用open函数将out对象流和file关联起来
第二种方式,创建空对象流,调用open函数关联文件:
ofstream out; //创建空对象流out
out.open(file); //调用open函数关联file文件
小贴士!!!
默认模式打开文件进行输出将自动打开文件的长度截为零,即删除已有内容。 (细节!!)
输入文件(读取文件)
读取文件的一般步骤:
(1)创建一个ifstream对象流,对象流都会定义一个open成员函数;
(2)将该对象与特定的文件关联起来,即关联一个文件;
(3)以使用cin的方式使用该对象流;
如下例子创建对象流和关联文件:
第一种方式,创建对象流时就关联文件,open函数会被自动调用(文件名初始化文件流对象):
ifstream in(file); //自动调用open函数将in对象流和file关联起来
第二种方式,创建空对象流,调用open函数关联文件:
ifstream in; //创建空对象流in
in.open(file); //调用open函数关联file文件
成员函数open和close
对象流都有一个open和close成员函数,
open用来打开某个文件,将文件流和文件关联起来
close用来断开对象流和文件的关联。如果一个文件流想要关联另一个文件,则需要先断开已经关联的文件,如:
ifstream in; //创建空对象流in
in.open(file); //调用open函数关联file文件
in.close(); // 关闭文件
in.open(ifile+"2") // 打开另一个文件
流状态检查和is_open()
打开文件时,对open状态是否成功检查是一个好习惯,有时候可能调用open失败,较新的c++检查文件是否被打开的方法——is_open()方法
以前检查文件是否被成功打开的方式(尽量用is_open):
(1)if(in.fail())...
(2)if(!in.good())...
(3)if(!in)...
文件模式
每个流都有一个关联的文件模式,用来指出如何使用文件,下表列出了文件模式及其含义:
文件模式 | |
in | 读方式打开 |
out | 写方式打开 |
app | 每次写操作前均定位到文件末尾 |
ate | 打开文件后立即定位到文件末尾 |
trunc | 截断文件 |
binary | 二进制方式进行IO |
程序实例
下边是实现一个程序,完成输入和输出操作,程序主要功能:
(1)首先显示文件当前内容(如果有的话)
(2)程序以app模式打开,进行写操作
(3)程序进行读操作,显示文件内容
# include<iostream>
# include<fstream>
# include<string>
using namespace std;
int main()
{
//读取初始文件内容,并输出显示
ifstream in;
in.open("guest.txt");
char ch;
if (in.is_open())
{
cout << "Here are the current contents of thepeople.text's file:" <<endl;
while (in.get(ch))
cout << ch;
cout << endl;
in.close();
}
// 添加内容到文件
ofstream out;
out.open("D:guest.txt", ofstream::app); //out.open("people.txt", ios_base::app);
if (!out.is_open())
{
cout << "failed to open file" << endl;
}
cout << "Please enter content:";
string str;
while (getline(cin, str) && str.size() > 0)
{
out << "\n"<<str << endl;
}
out.close();
//读取修改后的文件内容,并输出显示
in.open("guest.txt");
if (in.is_open())
{
cout << "Here are the revised contents of the people.text's file:" << endl;
while (in.get(ch))
cout << ch;
cout << endl;
in.close();
}
return 0;
}
第一次运行,因为不存在guest.txt文件,所以读取失败,直接进行写操作和输出操作
第二次运行,文件已经存在,则进行读-写-读操作