<fstream> 和<fstream.h>
<fstream.h>支持ios::nocreate和ios::noreplace标记。<fstream>库不支持这些标记。然而,这篇文章讲述了如何很容易地仿制它们的功能。
文件的重定位
每一个文件对象都有一个逻辑指针以指向文件中一定的位置偏移量。你可以通过调用seekp()成员函数来指定逻辑指针到文件中的任一位置,seekp()成员函数通过指定的位置偏移量实现文件中重新定位。在下面的范例中,程序定位到第10字节的文件位置,然后调用tellp()来输出新的位置:
ofstream fout("parts.txt");
fout.seekp(10); // move 10 bytes ahead from beginning
cout<<"new position: "<<fout.tellp(); // display 10
seekp()成员函数还有另一个赋值方式,即将文件偏移方向作为第二个变量。例如,这个函数可以从当前位置向后移动2个字节到新的位置:
fout.seekp(-3, ios::cur);
你还可以使用以下的标记指定文件位置的方向:
ios::beg // 文件开始的位置
ios::cur //当前位置,比如:ios::cur+5
ios::end // 文件末尾的位置
将读和写操作结合起来
<fstream>类能以<<和>>操作符来执行所有的数据类型,如std::string和std::complex。表C显示了如何使用这些操作符来执行一个结合的读和写的操作。程序打开一个文件,写入两个域,重新回到文件的起始位置,然后读取原来的域到time_t和std::string对象。
支持多种功能
<fstream>类库的另一个显著特性是能够支持wchar_t。到目前为止,我所讨论的每个类都具有能够支持包含有wchar_t数据的wchar_t等价物。然而,标准C++只支持字符型的文件名,所以这些类只能带有char *的变量,而不管它们的内容。表D显示了表A中看到的wchar_t版本。可以看到,从基于字符型的I/O到wchar_t的转换是非常的容易。
对于<stdio.h>,<fstream>是可行的选择
必须承认,<fstream>也不是绝对的完美,它也不能提供每一个程序员的所有要求。例如,习惯于文件描述符(而不是文件名)的UNIX开发人员会觉得<fstream>非常的繁琐,因为还没有将描述符转化为文件名的标准方法。同样,不支持wchar_t文件名也会在一定的环境下碰到很多障碍。然而,如果你选择<fstream>,你会觉得这是一种更加直觉,稳定,方便的方法。