Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
stringstream是否有两个缓冲区和两个标记? < C++入门>第17章;I/O流;据说,类型为std::iostream的对象或派生类型如std::fstream,std::stringstream既支持读取也支持写入。此外,这些类型只有一个标记和一个缓冲区:_C++_Fstream_Stringstream - Fatal编程技术网

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