对于文件的读写操作,C++提供了更为方便强大的模式功能,我们当然可以使用传统的C-FILE*模式打开文件,也可以使用Windows提供的CreateFile函数获得文件句柄,但是考虑到跨平台和简便性,还是要数C++的iostream类对象。iostream提供了对于标准输入输出、文件读写和内存string读写的全套机制,当然,这一切都建立在类树结构的继承-派生机制之上。关于C++的标准I/O库的资料网上有很多,今天自己就仅仅总结下自己认为比较重要的几个知识点。
1. 标准I/O库的组织结构:
iostream类继承自ostream和istream,同时兼顾读取和写入,而ostream专门处理数据流的写入问题,派生出ofstream(文件)和ostringstream(string类型),istream则专门处理数据流的读取问题,派生出ifstream(文件)和istringstream(string类型)。
标准I/O库只有三个头文件:iostream(cin/cout/cerr),fstream(ifstream/ofstream/fstream),sstream(istringstream/ostringstream/stringstream)。自己刚开始时还犯了#include 这样的错误。
2. 文件的输入与输出
文件的输入与输出主要依赖fstream/istream/ostream三种类,配合使用打开的模式从而实现文件的读取和写入。主要步骤如下:
创建一个文件流对象,绑定文件名,打开该文件:
ifstream ifile("test"); //定义对象时使用构造函数初始化
ofstream ofile;
ofile.open("test", ofstream::out | ofstream::app);
string name("test");
fstream file;
file.open(name.c_str(), fstream::in | fstream::out); //由于兼容性考虑,open函数只能接受C格式字符串,因此必须将string提取为C格式字符串,by c_str()方法
检查文件是否成功打开绑定:
if (!file)
{
cerr << "Unable to open file: "
<< file << endl;
return -1;
}
向文件对象写入/读取:
ofile << "Hello, World!"<< endl;
getline(ifile, string); //从ifile读取一行字符串写入string中
关闭文件,清空状态:
file.close();
file.clear();
注意!单纯close文件对象不会清空记录的条件状态,因此如果重复使用同一个文件对象务必调用clear函数将其状态清空刷新!
3. 打开模式的几个问题
与ifstream流对象关联的文件将默认以ifstream::in模式打开;与ofstream流对象关联的文件对象则默认以ofstream::out和ofstream::trunk模式打开;与fstream流对象关联的文件对象则默认以fstream::in | fstream::out模式打开。一般来说,几种文件打开模式可以自由组合,但是有一些简单的规则,比如in和app是不能搭配的,同样in和trunk(清空文件内容)也是不能搭配的,可用的有效搭配有:
out; out | app; out | trunk
in; in | out; in | out | trunk
4. 一个例子程序:
-
#include <fstream>
-
#include <iostream>
-
#include <string>
-
using namespace std;
-
-
int main()
-
{
-
//test ofstream
-
ofstream o_file;
-
o_file.open("test-file.txt",ofstream::out);
-
if (!o_file)
-
{
-
cerr << "Unable to open o_file !"
-
<< o_file <<endl;
-
system("pause");
-
return -1;
-
}
-
o_file << "This is a ofstream test!" <<endl;
-
o_file.close();
-
o_file.clear();
-
-
//test ifstream
-
string str_fi;
-
ifstream i_file;
-
i_file.open("test-file.txt", ifstream::in);
-
if (!i_file)
-
{
-
cerr << "Unable to open i_file !"
-
<< i_file <<endl;
-
system("pause");
-
return -2;
-
}
-
getline(i_file, str_fi);
-
cout << "string in file is : "
-
<< str_fi << endl;
-
//test
-
//string str_tst;
-
//i_file >> str_tst;
-
//cout << "str_tst: "
-
// << str_tst <<endl;
-
i_file.close();
-
i_file.clear();
-
-
//test fstream
-
fstream file;
-
file.open("test-file.txt", fstream::out |fstream::app);
-
if (!file)
-
{
-
cerr << "Unable to open file !"
-
<< file <<endl;
-
system("pause");
-
return -3;
-
}
-
file << "This is a fstream test!"
-
<<endl;
-
file.close();
-
file.clear();
-
-
system("pause");
-
return 0;
-
-
-
-
}
阅读(326) | 评论(0) | 转发(0) |