2.6 文件的读写

在C语言中,完成打开和处理文件这样复杂的操作,需要对C语言有较深的了解。然而C++语言的iostream库提供了一种简单的方法来处理文件,因此,介绍这个功能可以比在C语言中介绍这一功能更早。

为了打开文件进行读写操作,必须包含<fstream>。虽然<fstream>会自动包含<iostream>,但如果打算使用cin, cout,最好还是显式地包含<iostream>。

为了读而打开文件,要创建一个ifstream对象,它的用法与cin相同,为了写而打开文件,要创建一个ofstream对象,用法与cout相同。一旦打开一个文件,就可以像处理其他iostream对象那样对它进行读写,非常简单。

在iostream库中,一个十分有用的函数是getline(),用它可以把一行读入到string对象中(以换行符结束)[1]。getline()的第一个参数是ifstream对象,从中读取内容,第二个参数是stream对象。函数调用完成之后,string对象就装载了一行内容。

下面是一个简单的例子,将一个文件的内容拷贝到另一个文件:

2.6 文件的读写 - 图1

从上面的程序可以看出,为了打开一个文件,只要将欲建立的文件名交给ifstream和ofstream对象即可。

这里引入了一个新概念—while循环。我们将在下一章对它进行详细的介绍。while循环的基本思想是用while后面带括号中的表达式来控制下一条句(也可以是用大括号括起来的多条语句)的执行。只要括号中的表达式(在这个例子中是getline(in, s))产生“true”结果,则继续执行由while控制的语句。就是说,如果getline()成功地读入一行,它就返回“true”值。如果到达输入结束,则返回“false”。上面程序中while循环逐行读取输入文件,然后将它们写入到输出文件。

getline()逐行读取字符,遇到换行符终止(终止字符是可以改变的,我们在第二卷输入输出流一章再讨论)。getline()将丢弃换行符而不把它存入string对象。因此,想使拷贝的文件看上去和源文件一样,必须加上换行符,如上所示。

另一个有趣味的例子是把整个文件拷贝成单独的一个string对象:

2.6 文件的读写 - 图2

string具有动态特性,不必担心string的内存分配;只管添加新内容进去就行了,string会自动扩展以保存新的输入。

把整个文件都输入到一个字符串中,好处之一就是,string类有许多函数可用来对字符串进行查找和操作,使用它们可以把文件当成单个的字符串来处理。但也有一定的局限性。把一个文件作为许多行的集合而不是一大段文本来处理,通常是很方便的。例如,如果想对每一行都加上行号,把每行作为一个单独的string对象会非常容易。要完成这项工作,我们需用别的方法。

[1]getline()实际有很多参数,我们将在第2卷的“iostreams”一章中详尽讨论。