C++中的文件输入/输出(3)
原作:Ilia Yordanov,
掌握输入/输出流
在这一章里,我会提及一些有用的函数。我将为你演示如何打开一个可以同时进行读、写操作的文件;此外,我还将为你介绍其它打开文件的方法,以及如何判断打开操作是否成功。因此,请接着往下读!
到目前为止,我已为你所展示的只是单一的打开文件的途径:要么为读取而打开,要么为写入而打开。但文件还可以以其它方式打开。迄今,你应当已经认识了下面的方法:
ifstream OpenFile(“cpp-home.txt”);
噢,这可不是唯一的方法!正如以前所提到的,以上的代码创建一个类ifstream的对象,并将文件的名字传递给它的构造函数。但实际上,还存在有不少的重载的构造函数,它们可以接受不止一个的参数。同时,还有一个open()函数可以做同样的事情。下面是一个以上代码的示例,但它使用了open()函数:
ifstream OpenFile;
OpenFile.open(“cpp-home.txt”);
你会问:它们之间有什么区别吗?哦,我曾做了不少测试,结论是没有区别!只不过如果你要创建一个文件句柄但不想立刻给它指定一个文件名,那么你可以使用open()函数过后进行指定。顺便再给出一个要使用open()函数的例子:如果你打开一个文件,然后关闭了它,又打算用同一个文件句柄打开另一个文件,这样一来,你将需要使用open()函数。
考虑以下的代码示例:
#include <fstream.h>
void read(ifstream &T) //pass the file stream to the function
{
//the method to read a file, that I showed you before
char ch;
while(!T.eof())
{
T.get(ch);
cout << ch;
}
cout << endl << "--------" << endl;
}
void main()
{
ifstream T("file1.txt");
read(T);
T.close();
T.open("file2.txt");
read(T);
T.close();
}
据此,只要file1.txt和file2.txt并存储了文本内容,你将看到这些内容。
现在,该向你演示的是,文件名并不是你唯一可以向open()函数或者构造函数(其实都一样)传递的参数。下面是一个函数原型:
ifstream OpenFile(char *filename, int open_mode);
你应当知道filename表示文件的名称(一个字符串),而新出现的则是open_mode(打开模式)。open_mode的值用来定义以怎样的方式打开文件。下面是打开模式的列表:
名称 |
描述 |
ios::in |
打开一个可读取文件 |
ios::out |
打开一个可写入文件 |
ios::app |
你写入的所有数据将被追加到文件的末尾,此方式使用ios::out |
ios::ate |
你写入的所有数据将被追加到文件的末尾,此方式不使用ios::out |
ios::trunk |
删除文件原来已存在的内容(清空文件) |
ios::nocreate |
如果要打开的文件并不存在,那么以此参数调用open()函数将无法进行。 |
ios::noreplace |
如果要打开的文件已存在,试图用open()函数打开时将返回一个错误。 |
ios::binary |
以二进制的形式打开一个文件。 |