stringstream是否有两个缓冲区和两个标记? < C++入门>第17章;I/O流;据说,类型为std::iostream的对象或派生类型如std::fstream,std::stringstream既支持读取也支持写入。此外,这些类型只有一个标记和一个缓冲区:
stringstream是否有两个缓冲区和两个标记? < C++入门>第17章;I/O流;据说,类型为std::iostream的对象或派生类型如std::fstream,std::stringstream既支持读取也支持写入。此外,这些类型只有一个标记和一个缓冲区:,c++,fstream,stringstream,C++,Fstream,Stringstream,fstream和stringstream类型可以读取和写入相同的流。在这些类型中,有一个保存要读写的数据的缓冲区和一个表示缓冲区中当前位置的标记。库将g和p位置映射到此单个标记 为了了解更多,我做了这个项目: int main(){ std::fstream fio("data.txt"); std::cout << fio.tellg() << '\t' << fio.tellp() << '\n';
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';
}
- 正如您在使用
时所看到的,如果我使用std::fstream
移动读取标记,则seekg()
和tellg
返回相同的值。这很合乎逻辑tellp
- 但是,当移动
的读取标记时,std::stringstream
和tellg
返回不同的值,因此写入标记没有被移动tellp
- 这是否意味着
有两个缓冲区和两个标记?谢谢std::stringstream
是的,这本书是错的 它是同步读写位置的控制器 类模板basic\u fstream对基于文件的流执行高级输入/输出操作。它将基于文件的streambuffer(std::basic_filebuf)与(std::basic_iostream)的高级接口进行接口 但是,基类维护单独的输入和输出缓冲区。注意 I/O流对象std::basic_istream和std::basic_ostream,以及从它们派生的所有对象(std::ofstream、std::stringstream等),完全按照std::basic_streambuf实现
0 0
14 14
0 0
13 0