C++ fstream 文件流怎么用呢?

来源:互联网 发布:西安软件新城公交 编辑:程序博客网 时间:2024/04/27 18:03

C++ fstream 文件流怎么用呢?
 
#include <fstream>
...


ofstream out("xx.txt");
这样就可以打开一个文件。
//写出。
out.close();关闭。
这篇文章转载自ZDNet,仅仅是因为今天恰好用到了fstream以此作为这个分类的首篇文章,版权归原作者所有。

 

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

介绍一下<fstream>类
[被屏蔽广告]

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

std::ofstream dictionary("myfile.txt");

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

std::ofstream dictionary;
dictionary.open("myfile.txt");
dictionary.close(); //explicit

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

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

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

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

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


--------------------------------------------------------------------------------

<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>,你会觉得这是一种更加直觉,稳定,方便的方法。

 

原创粉丝点击