【问题标题】:fstream - How to seekg() to position x from endfstream - 如何 seekg() 从末尾定位 x
【发布时间】:2015-10-10 21:03:53
【问题描述】:

我正在寻找一种方法将我的 get 指针设置在 fstream 末尾的 x 位置。

我试过了

file.seekg(-x, ios_base::end);

但是根据this question,这行是未定义的行为。

  • 我怎样才能以任何方式从 fstream 的末尾定位 x?

【问题讨论】:

    标签: c++ fstream seekg


    【解决方案1】:

    如果你想将指针设置在距离末端 x 的位置,你需要知道末端在哪里,所以你需要开始:

    file.seekg(0, ios_base::end);
    int length = file.tellg();
    

    当你知道文件长度后,你可以设置你的指针:

    file.seekg(length - x, ios_base::beg);
    

    【讨论】:

    • 原谅我,我的错。我把你的解决方案误认为是tellg() - x。赞一个。
    【解决方案2】:

    问题与文本模式有关,它可能会将文件中的某些字节序列转换为不同大小的序列。

    以windows下的文本模式为例。这里磁盘上文件中的字节序列'\r' '\n'在读取时转换为'\n'。现在假设你有一个文件:

    Hello\r\n
    World\r\n
    

    如果你将自己定位在file.seekg(-1, ios_base::end);,结果是不确定的,因为不清楚结果应该是什么:

    • 您是否应该简单地定位在'\n'?但是在这种情况下,以相反的顺序读取文件将与以正确的顺序读取文件不一致。
    • 是否应该定位在'\r',因为'\r' '\n'应该被理解为一个字节?但在这种情况下,定位必须逐字节完成,并且对于每个字节,库都必须检查前一个字节,以防万一。

    顺便说一句,这也是为什么你应该只直接seekg() 到以前由tellg() 获得的职位的原因。

    如果你真的要从头开始做这种定位,如果你以ios::binary打开文件,因为这样你就可以确定一个字节总是一个字节,无论是从尾数还是从头数。

    【讨论】:

    • 非常感谢您解释为什么它是未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2012-06-16
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多