【发布时间】:2021-02-21 21:24:43
【问题描述】:
关于 C++ 入门第 17 章; I/O 流;据说std::iostream 类型的对象或std::fstream、std::stringstream 这样的派生类型同时支持读写。这些类型也只有一个 Marker 和一个 Buffer:
fstream和stringstream类型可以读取和写入相同的流。在这些类型中,有一个缓冲区保存要读取和写入的数据,还有一个标记表示缓冲区中的当前位置。该库将g和p位置映射到这个单个标记。
为了了解更多,我完成了这个程序:
int main(){
std::fstream fio("data.txt");
std::cout << fio.tellg() << '\t' << fio.tellp() << '\n';
fio.seekg(0, std::ios::end);
std::cout << fio.tellg() << '\t' << fio.tellp() << '\n';
std::stringstream ss("abcd\nefg\nhi\nj");
std::cout << ss.tellg() << '\t' << ss.tellp() << '\n';
ss.seekg(0, std::ios::end);
std::cout << ss.tellg() << '\t' << ss.tellp() << '\n';
}
输出:
0 0
14 14
0 0
13 0
-
正如您在使用
std::fstream时看到的,如果我使用seekg()移动读取标记,那么tellg和tellp返回相同的值。这太合乎逻辑了。 -
但是,当移动
std::stringstream、tellg和tellp的读取标记时返回不同的值,所以写入标记没有被移动? -
这是否意味着
std::stringstream有两个缓冲区和两个标记?谢谢
【问题讨论】:
标签: c++ fstream stringstream