首页 服务器 编程 必备知识 搜索引擎 圩日手册
站内搜索
最近浏览
推荐文章
热文排行

C++中的fstream类用于文件的I/O操作


文件的I/O库提供了ANSI C的很多有用的优点,包括面向对象的界面,国际化和地方化的支持,安全性能,以及简单的调试。让我们看看如何有效地使用这些类库。

介绍一下类

库包含了三个基本的类:ifstream, ofstream和fstream。这三个类分别代表一个输入文件,一个输出文件,以及一个输入输出文件。Ifstream类支持>>操作符,ofstream类支持<<操作符,fstream类同时支持>>和<<操作符。所有对象都能够把一个文件名当成构造函数的变量,并能够自动的打开文件,如:

std::ofstream dictionary(“myfile.txt”);

类的析构函数自动地添加清除文件内容并关闭文件,所以当你忘记关闭文件时也无大碍。如果在构造函数中不提供一个文件名,可以通过调用open()成员方法来打开文件,如下所示:

std::ofstream dictionary;

dictionary.open(“myfile.txt”);

dictionary.close(); //explicit

为了能演示库的强大功能,我们先看看一个具体的范例。表A包含了一个程序,程序的功能为:生成了一个名为dictionary的ifstream对象,打开一个名为dict.txt的文件,以及在屏幕上打印每一个字。

相对于典型的程序,这个程序要简单得多了。第一,在每一次读取操作着无需检查EOF(end of file)。类执行!操作符,如果产生错误,!操作符的值即为原值的相反。我们可以利用这一特点来检查文件是否正确的打开。第二,While循环也使用这一操作符来检查文件的状态。最后,当程序结束时,dictionary对象的析构函数会自动地关闭文件。

文件打开模式

如果你不具体指明文件的打开模式,fstream类会使用缺省模式。例如,ifstream在缺省情况下会以读的模式打开一个文件,并把文件指针定在文件的起始处。同样的,ofstream在缺省情况下也是以读的模式打开一个文件。你可以通过使用OR操作符设置多个标记,如下所示:

ofstream logfile("login.dat", ios::binary|ios::app);

表B包含了一系列的文件打开模式和文件属性。

支持ios::nocreate和ios::noreplace标记。库不支持这些标记。然而,这篇文章讲述了如何很容易地仿制它们的功能。

文件的重定位

每一个文件对象都有一个逻辑指针以指向文件中一定的位置偏移量。你可以通过调用seekp()成员函数来指定逻辑指针到文件中的任一位置,seekp()成员函数通过指定的位置偏移量实现文件中重新定位。在下面的范例中,程序定位到第10字节的文件位置,然后调用tellp()来输出新的位置:

ofstream fout("parts.txt");

fout.seekp(10); // move 10 bytes ahead from beginning

cout<<"new position: "<

seekp()成员函数还有另一个赋值方式,即将文件偏移方向作为第二个变量。例如,这个函数可以从当前位置向后移动2个字节到新的位置:

fout.seekp(-3, ios::cur);

你还可以使用以下的标记指定文件位置的方向:

ios::beg // 文件开始的位置

ios::cur //当前位置,比如:ios::cur+5

ios::end // 文件末尾的位置

将读和写操作结合起来

类能以<<和>>操作符来执行所有的数据类型,如std::string和std::complex。表C显示了如何使用这些操作符来执行一个结合的读和写的操作。程序打开一个文件,写入两个域,重新回到文件的起始位置,然后读取原来的域到time_t和std::string对象。

支持多种功能

类库的另一个显著特性是能够支持wchar_t。到目前为止,我所讨论的每个类都具有能够支持包含有wchar_t数据的wchar_t等价物。然而,标准C++只支持字符型的文件名,所以这些类只能带有char *的变量,而不管它们的内容。表D显示了表A中看到的wchar_t版本。可以看到,从基于字符型的I/O到wchar_t的转换是非常的容易。

对于,是可行的选择

必须承认,也不是绝对的完美,它也不能提供每一个程序员的所有要求。例如,习惯于文件描述符(而不是文件名)的UNIX开发人员会觉得非常的繁琐,因为还没有将描述符转化为文件名的标准方法。同样,不支持wchar_t文件名也会在一定的环境下碰到很多障碍。然而,如果你选择,你会觉得这是一种更加直觉,稳定,方便的方法。

[wangjy17908]
添加时间:2008-03-30
版权所有(C)2005-2015