【问题标题】:are "seekp" & "seekg" interchangeable?“seekp”和“seekg”可以互换吗?
【发布时间】:2012-12-29 01:13:59
【问题描述】:

我刚刚注意到,通过“seekp”在 microsoft visual studio 中更改位置,我在处理文件时也隐含地更改了读取位置。

我想知道这是否是“便携式”行为?我可以期望阅读和写作的位置始终相同吗?因此:tellptellg 是否总是返回相同的值?

【问题讨论】:

标签: c++ position binaryfiles fstream


【解决方案1】:

对于文件位置,它们是相同的。换句话说,只维护了 一个 指针。

来自27.9.1.1p3

为输入序列和 输出序列。

所以,seekgseekp 对于文件流是可以互换的。但是,对于其他类型的流来说,情况并非如此,因为它们可能持有用于 put 和 get 位置的单独指针。

【讨论】:

    【解决方案2】:

    更新:所以从所有的 cmets 和一切来看,似乎对于 fstream、seekp 和 seekg 使用相同的指针。但是对于 stringstream 和可能其他非基于文件的流,它们是分开的。


    原帖:

    在带有 g++ 4.7.2 的 linux 上对我不起作用。他们似乎是独立的:

    #include <sstream>
    #include <iostream>
    
    int main(int, char**) {
        std::stringstream s("0123456789");
        std::cout << "put pointer: " << s.tellp() << std::endl;
        std::cout << "get pointer: " << s.tellg() << std::endl;
        std::cout << std::endl;
        s.seekp(2);
        std::cout << "put pointer: " << s.tellp() << std::endl;
        std::cout << "get pointer: " << s.tellg() << std::endl;
        std::cout << std::endl;
        s.seekg(4);
        std::cout << "put pointer: " << s.tellp() << std::endl;
        std::cout << "get pointer: " << s.tellg() << std::endl;
        std::cout << std::endl;
    }
    

    输出:

    put pointer: 0
    get pointer: 0
    
    put pointer: 2
    get pointer: 0
    
    put pointer: 2
    get pointer: 4
    

    你描述的行为听起来也不符合here的引号:

    设置获取指针的位置。获取指针确定 要在与流关联的源中读取的下一个位置。

    here:

    设置放置指针的位置。 put 指针确定在 下一个输出操作将要进行的输出序列 地点。

    【讨论】:

    • 谁可以否决这个,请留下评论为什么?
    • 我没有投反对票,但我可以猜到原因:虽然您所显示的字符串准确无误,但对于文件流来说,不是
    • 是的,有道理 :) 我最初没有看到那个 fstream 标记
    • @JerryCoffin 部分可能是我的错误;起初我只在我使用 fstream 的标签中指定,后来做了一个小更新:|
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多