第十二讲:文件流

Download Report

Transcript 第十二讲:文件流

第十二讲
文件流
1
内容提要
 C++输入输出流
 文件流类与文件流对象
 文件的打开与关闭
 文本文件的读写
 二进制文件的读写
2
流类
在 C++中,输入输出流被定义为类。C++ 的 I/O 库中的类称
为流类 (stream class)。 用流类定义的对象为流对象。
C++ 的 I/O 库中的常用流类
类名
作用
头文件
ios
抽象父类
iostream
istream
ostream
iostream
通用输入流和其他输入流的父类
通用输出流和其他输出流的父类
通用输入输出流和其他输入输出流的父类
iostream
ifstream
ofstream
fstream
输入文件流类
输出文件流类
输入输出文件流类
fstream
istrstream
ostrstream
strstream
输入字符串流类
输出字符串流类
输入输出字符串流类
strstream
流类继承层次
ios
ostream
istream
ifstream
iostream
fstream
ofstream
文件流类
 文件流头文件:fstream
#include <fstream>
 该头文件中定义了三个文件流类
ofstream
向文件写入数据
ifstream
fstream
从文件读取数据
可以读写文件
文件流对象
 创建文件流对象
fstream fstrm;
// 创建一个文件流对象,未绑定到任何文件
fstream fstrm(fname); // 创建一个文件流,并绑定到文件 fname
fstream fstrm(fname, mode);
// 创建一个绑定到 fname 的文件流,并一指定的模式打开文件
 这里的类 fstream 也可以是 ifstream 或 ofstream
 ifstream 对象所关联的文件只能读
 ofstream 对象所关联的文件只能写
文件流类成员函数
 文件流对象基本操作(成员函数)
fstrm.open(fname)
fstrm.close()
fstrm.is_open()
// 将文件流对象 fstrm 绑定到文件 fname
// 关闭与文件流对象 fstrm 绑定的文件
// 测试文件是否已顺利打开(且未关闭)
 将文件流对象关联到其它文件时,须先关闭已绑定的文件
 文件流对象被释放时,close 会被自动调用
文件打开模式
 文件流对象关联到文件时,需指定文件打开模式
in
out
app
ate
trunc
binary
//
//
//
//
//
//
只读方式打开
只写方式打开,若文件存在,则内容被清除
追加方式打开,即每次写操作均定位到文件末尾
打开文件后立即定位到文件末尾
打开文件,若文件存在,则清除文件中原有的内容
以二进制方式进行读写(缺省为文本文件)
 以上方式可以组合使用,中用 “|”隔开
 ifstream 对象只能设定 in 模式
 ofstream 对象只能设定 out 模式
 fstream 对象可以设定 in 或/和 out 模式
 app 模式总是以 out 方式打开
 out 方式打开的文件中原内容会被清除,app 方式除外
文件打开模式
 缺省模式
 ifstream 对象的缺省模式是 in
 ofstream 对象的缺省模式是 out
 fstream 对象的缺省模式是 in 和 out
 只有不指定打开模式时才会调用缺省模式!
保留文件原有内容的方法是使用 app 模式或 in 模式
文件打开模式
ifstream ifstrm;
ofstream ofstrm;
fstream fstrm;
ifstrm.open("fname1"); // 以缺省方式打开一个文件
ofstrm.open("fname2",ofstream::out|ofstream::app);
fstrm.open("fname3",fstream::app);
 模式前面需要加类名,可以是 ios 或者对应的类名
ofstream ofstrm;
ofstrm.open("fname2",ios::out|ios::app);
文本文件操作
 文本文件的写:<<
fstream fstrm("fname.txt",fstream::out|fstream::in);
fstrm << "Hello Math!" << endl;
fstrm << "This is an example" << endl;
fstrm.close();
ex12_fstream01.cpp
 文本文件的读:>> 或 getline
char str1[20], str2[20];
fstream fstrm("fname.txt",ios::out|ios::in); // ios
fstrm >> str1;
fstrm.getline(str2,12);
fstrm.close();
 我们是如何使用 cin 和 cout 的, 就可以同样来使用文件流对象
二进制文件操作
 对二进制文件使用 <<、>> 或 getline 是没有意义的。
此时需要使用父类 ostream 的成员函数 write 和父类
istream 的成员函数 read。
 write 和 read 的函数原型
write(char * buffer, streamsize size );
read(char * buffer, streamsize size );
二进制文件操作举例
const in n=5;
int A[n]={1,2,3,4,5};
fstream fstrm("fout.dat",ios::out|ios::binary);
fstrm.write((char*)A,sizeof(A));
fstrm.close();
int B[n];
fstrm.open("fout.dat",ios::in|ios::binary);
fstrm.read((char*)B,sizeof(B));
fstrm.close();
ex12_fstream02.cpp
上机作业(文件操作)
 用文件流方式完成下面操作
1) 生成一个 6X6 的矩阵 A,其元素为 [0,1] 之间的双精度数。
(a) 将其按矩阵形式写入到一个文本文件 out01.txt 中;
(b) 将其写入到一个二进制文件 data01.dat 中;
(c) 从二进制文件 data01.dat 中读取前12个数据(双精度),
构成一个 2X6 的矩阵 B,并将 B 按行输出。
(程序命名为 hw12_01.cpp )
2) 从课程主页上下载二进制数据文件 data02.dat,从文件中读取前60个元
素(双精度),构成一个 30X2 的矩阵 A。然后将其按矩阵形式写入到一
个文本文件 out02.txt 中。(程序命名为 hw12_02.cpp )
14