c++ primer上说,seek,tell函数的两个版本让人误以为fstream,stringstream的输入流、输出流各自有一个标记,而事实上只有一个标记。用vc9.0实验发现,fstream的确如此,读入字符之后输出流标记也随之变化;但是stringstream却不然,读入字符之后输出流标记不变。
进而又发现,虽然fstream只有一个标记,但程序不能有连续的读写/写读,除非两操作之间有seekp或seekg。也就是说,读取流的语句后面必须先有seekp确定写入的位置(即便就是当前位置),才能成功写入。反之亦然。
然而,stringstream虽然有两个不同的标记,但是有连续读写/写读操作时,不必调用seek。
所以说,不论是fstream还是stringstream,同时进行读写时都最好先调用seek,一是为了确定位置,二是为了成功写入。