1.面向行的输入
要获取一行输入,有两种选择:成员函数get()或getline()。两个函数都有三个参数:指向存储结果字符的缓冲区指针、缓冲区大小(不能超过其限度)和知道什么时候停止读输入的终止符。终止符有一个经常用到的缺省值”/n”。两个函数遇到输入终止符时,都把零储存在结果缓冲区里。
其不同点是什么呢?get()遇到输入流的分隔符时就停止,而不从输入流中提取分隔符。如果用同样的分隔符再调用一次get()函数,它会立即返回而不带任何输入。getline()与其相反,它从输入流中提取分隔符,但仍没有把它储存在结果缓冲区里。
总之,当我们在处理文本文件时,无论什么时候读出一行,都会想到用getline()。
2.输入输出流缓冲
每一个输入输出流都包含一个指针,指向某种streambuf(这依赖于它是否处理标准I\O、文件、内存等等)。我们可以直接访问streambuf。
当前,我们要知道的最重要的事是:每个输入输出流对象包含一个指向streambuf的指针,而且,如果需要调用的话,streambuf有我们可以调用的成员函数。
为了允许我们访问streambuf,每个流对象有一个叫做rdbuf()的成员函数,这个函数返回指向对象的streambuf的指针。这样,我们可以为下层的streambuf调用任何成员函数。然而,对streambuf指针所做的最有兴趣的事之一是:使用“<<”操作符将其与另一个输入输出流联结。这使我们的对象中的所有字节流进“<<”左边的对象中。这意味着,如果把一个输入输出流的所有字节移到另一个输入输出流,我们不必做读入它们的一个字节或一行这样单调的工作。
3.在输入输出流中查找
在某些情况下,可能需要移动这个流的位置,可以用两种方式处理:第一种方式是在流里绝对定位,叫流定位(streampos);第二种方式像标准C库函数fseek()那样做,从文件开始、结尾或当前位置移动给定数目的字节。
流定位(streampos)方法要求先调用“tell”函数:对一个输出流用tellp()函数,对一个输入流用tellg()函数。(”p“指”放指针“,“g”指“取指针”)。要返回到流中的那个位置时,这个函数返回一个streampos,我们以后可以在用于输出流的seekp()函数或用于输入流的seekg()函数的单参数版本里使用这个streampos。
另一个方法是相对查找,使用seekp()和seekg()的重载版本。第一个参数是要移动的字节数,它可以是正的或负的。第二个参数是查找方向:
ios::beg 从流的开始位置
ios::cur 从流的当前位置
ios::end 从流的末尾位置
建立读/写文件
下面的代码首先建立一个有标志的ifstream,它既是一个输入文件又是一个输出文件,编译器不允许我们向ifstream写,因此,需要建立具有基本流缓冲区的输出流(ostream):
ifstream in(“filename”, ios::in | ios::out);
ostream out(in.buf());