華束师免大学数学科学学院 School of Mathematical Sciences,East China Normal University 第十五讲 文件流与输出输入重载 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 第十五讲 文件流与输出输入重载
输入输出流 在 C++中,所有的输入输出都通过“流”来描述。 D输入流: 数据流向程序(input) 一输出流:数据从程序中流出(output) ·具体实现方法:流类和流对象 口文件流类与文件流对象 口文件流对象与文件关联 口文件读写:文本文件与二进制文件 口重载输出输入运算符> http://math.ecnu.edu.cn/~jypan 2
http://math.ecnu.edu.cn/~jypan 2 输入输出流 文件流类与文件流对象 文件流对象与文件关联 文件读写:文本文件与二进制文件 重载输出输入运算符 > 在 C++ 中,所有的输入输出都通过“流”来描述。 ►输入流:数据流向程序 (input) ►输出流:数据从程序中流出 (output) ►具体实现方法:流类和流对象
C++I/O库中定义的流类 类名 作用 头文件 ios 抽象父类 iostream istream 通用输入流和其他输入流的父类 iostream ostream 通用输出流和其他输出流的父类 iostream 通用输入输出流和其他输入输出流的父类 ifstream 输入文件流类 fstream ofstream 输出文件流类 fstream 输入输出文件流类 ifstream istream ios iostream fstream ostream ofstream http://math.ecnu.edu.cn/~jypan 3
http://math.ecnu.edu.cn/~jypan 类名 作用 头文件 ios 抽象父类 iostream istream ostream iostream 通用输入流和其他输入流的父类 通用输出流和其他输出流的父类 通用输入输出流和其他输入输出流的父类 iostream ifstream ofstream fstream 输入文件流类 输出文件流类 输入输出文件流类 fstream ios istream ostream ifstream ofstream iostream fstream 3 C++ I/O 库中定义的流类
文件流类 口文件流头文件:fstream #include 该头文件中定义了三个文件流类 ofstream 向文件写入数据 ifstream 从文件读取数据 fstream 既读又写 http://math.ecnu.edu.cn/-jypan 4
http://math.ecnu.edu.cn/~jypan 文件流头文件:fstream ► 该头文件中定义了三个文件流类 ofstream 向文件写入数据 ifstream 从文件读取数据 fstream 既读又写 #include 4 文件流类
创建文件流对象 fstream fstrm; /1创建一个文件流对象,未绑定到任何文件 fstream fstrm(fname); //创建一个文件流,并绑定到文件fname fstream fstrm(fname,mode); //创建文件流的同时指定文件的打开模式 这里的类fstream也可以是ifstream或ofstream ·如果用ifstream.,则对象所关联的文件只能读 ·如果用ofstream.,则对象所关联的文件只能写 http://math.ecnu.edu.cn/~jypan 5
http://math.ecnu.edu.cn/~jypan ► 这里的类 fstream 也可以是 ifstream 或 ofstream ► 如果用 ifstream,则对象所关联的文件只能读 ► 如果用 ofstream,则对象所关联的文件只能写 5 fstream fstrm; // 创建一个文件流对象,未绑定到任何文件 fstream fstrm(fname); // 创建一个文件流,并绑定到文件 fname fstream fstrm(fname, mode); // 创建文件流的同时指定文件的打开模式 创建文件流对象
文件流成员函数 口文件流对象基本操作(成员函数) fstrm.open(fname) /将文件流对象fstrm绑定到文件fname fstrm.close() /关闭与文件流对象fstrm绑定的文件 fstrm.is_open() //测试文件是否已顺利打开(且未关闭) ·将文件流对象关联到其它文件时,须先关闭已绑定的文件 ·文件流对象被释放时,close会被自动调用 http://math.ecnu.edu.cn/~jypan 6
http://math.ecnu.edu.cn/~jypan 文件流对象基本操作(成员函数) ► 将文件流对象关联到其它文件时,须先关闭已绑定的文件 ► 文件流对象被释放时,close 会被自动调用 6 fstrm.open(fname) // 将文件流对象 fstrm 绑定到文件 fname fstrm.close() // 关闭与文件流对象 fstrm 绑定的文件 fstrm.is_open() // 测试文件是否已顺利打开(且未关闭) 文件流成员函数
文件打开模式 ios::in /只读 ios:out //只写,若文件存在,则内容被清除 ios:app /追加,即每次写操作均定位到文件末尾 ios::ate //打开文件后立即定位到文件末尾 ios:Trunc //若文件存在,则清除文件中原有的内容 ios::binary//以二进制方式进行读写 输入输出方式是在i0s类中定义的 以上方式可以组合使用,用“I”隔开,如ios::out|ios:binary Pios::app通常与ios:out组合使用 http://math.ecnu.edu.cn/~jypan 7
http://math.ecnu.edu.cn/~jypan ► 输入输出方式是在 ios类 中定义的 ► 以上方式可以组合使用,用“ | ”隔开,如 ios::out|ios::binary ► ios::app 通常与 ios::out 组合使用 7 ios::in // 只读 ios::out // 只写,若文件存在,则内容被清除 ios::app // 追加,即每次写操作均定位到文件末尾 ios::ate // 打开文件后立即定位到文件末尾 ios::Trunc // 若文件存在,则清除文件中原有的内容 ios::binary // 以二进制方式进行读写 文件打开模式
文件打开模式(续) ·在缺省情形下,文件以文本方式打开 ●ifstream对象只能设定in模式,缺省为in ●ofstream对象只能设定out模式,缺省为out ●fstream对象可以设定in或/和out模式 建议使用fstream对象进行文件读写操作。 ifstream ifstrm; ofstream ofstrm; fstream fstrm; ifstrm.open("fname1");/以缺省方式打开 ofstrm.open("fname2",ios:out); fstrm.open("fname3",ios:out|ios:app); http://math.ecnu.edu.cn/~jypan 8
http://math.ecnu.edu.cn/~jypan ► 在缺省情形下,文件以文本方式打开 ► ifstream 对象只能设定 in 模式,缺省为 in ► ofstream 对象只能设定 out 模式,缺省为 out ► fstream 对象可以设定 in 或/和 out 模式 8 ifstream ifstrm; ofstream ofstrm; fstream fstrm; ifstrm.open("fname1"); // 以缺省方式打开 ofstrm.open("fname2", ios::out); fstrm.open("fname3", ios::out|ios::app); † 建议使用 fstream 对象进行文件读写操作。 文件打开模式(续)
文本文件操作 文本文件的写:>或getline char str1[20],str2[20]; fstream fstrm("fname.txt",ios:in); fstrm>>str1;/缺省以空格为结束符 fstrm.getline(str2,12); fstrm.close(); 我们是如何使用cin和cout的,就可以同样来使用文件流对象 http://math.ecnu.edu.cn/~jypan 9
http://math.ecnu.edu.cn/~jypan 文本文件的写:> 或 getline 9 fstream fstrm("fname.txt",ios::out); fstrm > str1; // 缺省以空格为结束符 fstrm.getline(str2,12); fstrm.close(); † 我们是如何使用 cin 和 cout 的, 就可以同样来使用文件流对象 文本文件操作
文本文件举例 ex15_fstream02.cpp #include #include using namespace std; const int N=1g;//读入数据个数 int main() char name[20]; ifstream pf("namelist.txt",ios:in); for(int i=0;iname;/以空格为结束符(数据分隔符) cout <<i+1<"."<<name<<endl; return 0; http://math.ecnu.edu.cn/~jypan 10
http://math.ecnu.edu.cn/~jypan 10 #include #include using namespace std; const int N = 10; // 读入数据个数 int main() { char name[20]; ifstream pf("namelist.txt", ios::in); for(int i=0; i> name; // 以空格为结束符(数据分隔符) cout << i+1 << "." << name << endl; } return 0; } ex15_fstream02.cpp 文本文件举例