【问题标题】:why does cout.tellp always return -1?为什么 cout.tellp 总是返回 -1?
【发布时间】:2012-06-25 08:30:38
【问题描述】:

我想为 C++ 文本输出流提供类似选项卡的功能。该功能应该允许我说“注意这个位置”,然后允许多次插入操作,最后允许我说“添加足够的填充字符,以便结束 N 字符超过最初记录的位置”。

标准的iostream 系统似乎没有保持列位置,但我认为我可以使用tellp() 来伪造它。我的假设是,tellp() 在我的输出序列中的两个点之间的差异将对应于中间字节的数量。

不幸的是,至少在我的 Gnu C++ 环境中,cout 不保持流位置的虚构。每个cout.tellp() 拨打returns -1。这是为什么呢?

【问题讨论】:

  • tellp 绝不是任何流中的列位置。它仅在可搜索的流中有意义。
  • @R.MartinhoFernandes 是正确的。 tellp 应该告诉您要向 seekp 提供什么值才能回到当前位置。在这种情况下,它告诉你没有这种可能性。必须以其他方式支持 Entabbing。
  • 谢谢你们。这是我没能掌握的与 seekp 的关系。

标签: c++ iostream cout


【解决方案1】:

tellp 在流中返回一个位置,以便您可以找到它。控制台不允许搜索。此外,即使您将位置解释为“自创建以来写入流的字节数”,该数字也不会用于光标定位 - 屏幕环绕,其宽度通常是不可预测的。你只是不知道你在哪一列,因为行长是可变的。

如果您想在屏幕上合理定位光标,请查看 ANSI 终端规范和随附的转义命令。它们允许光标位置发现和放置。

http://ascii-table.com/ansi-escape-sequences.php

一般来说,屏幕不是流。键盘也不是,就此而言:)

【讨论】:

  • 谢谢塞瓦。是我没掌握的 seekp 和 tellp 的关系。
  • 谢谢@Seva。我不想做光标操作。对于 alignmnet,我只是想将带有尾随标点符号的左对齐值发送到固定宽度列(例如“1:”和“12:”)。因为这需要比单个插入操作更多的标准 width() 操纵器是不够的。如果您重新阅读我最初的问题,您会发现我并不打算将 tellp() 解释为列位置。我希望这两次调用 tellp() 之间的差异可以让我确定在它们之间插入了多少字节。
  • 我一直在寻找这个问题的答案:如何解释tellp() 返回的数字?答案:“自创建以来写入流的字节数”,感谢 Seva,+1。我通过以非编程方式检查文件的实际大小来验证。
  • 不一定。如果在写入后调用 seek,当前位置不会在文件末尾,tellp 会尊重这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2020-08-19
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多