Istream seekg()偏移量和ios::end
Istream seekg() offsets and ios::end
当我输入is.seekg(0)时,它会将我带到流的开头。但是,当我输入is.seekg(ios::end)时,它会把我带到第二个字符。为什么会发生这种情况。我认为我对此的误解源于对流是如何工作的根本缺乏了解。我认为,当你提供常量ios:end时,它会把你带到流的末尾。但是,它似乎让你前进了一个角色。
cin.seekg(0, ios::end);
int length = cin.tellg();
cout << length << endl;
cin.seekg(0);
cout << cin.tellg();
当我输入<包含"123456789"的文件
输出为10 0
现在,如果我这样做:
cin.seekg(ios::end);
int length = cin.tellg();
cout << length << endl;
输出为2
为什么?
此代码只是意外地工作
cin.seekg(ios::end);
int length = cin.tellg();
cout << length << endl;
值end
来自enum seekdir {beg, cur, end};
,因此ios::end
恰好可以转换为值为2
的整数。
不幸的是,seekg
的一个重载的参数是一个整数,因此调用变成了cin.seekg(2)
。虽然在技术上是有效的代码,但这绝对不是您想要的。
您正在将std::ios_base::seekdir
类型的内容转换为std::istream::pos_type
类型,并调用只接受一个参数的seekg
版本。该版本的seekg
将指针移动到绝对位置,而不是相对位置。
ios::end
是用于相对偏移的逻辑位置,而不是绝对位置。
您不能依赖STDIN的可查找性。这是因为它可能来自多种来源,包括绝对找不到的管道。当您重定向文件时,它很可能起作用,因为STDIN与文件流绑定。我不知道你是否可以相信,但这是我的猜测。我甚至从未考虑过在STDIN上寻找。我总是认为它是一根管子,即使它不是。与STDOUT相同。我不会输出一些东西,然后尝试回溯并"覆盖"输出。如果你发现自己需要在标准流中寻找,你可能应该重新思考你的方法。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用ios:ate写入到流会覆盖现有文件
- 如何访问RTCVideoRenderer的帧?(ios)
- ios::fmtflags 在 C++ 中是如何工作的?setf() 是如何工作的?
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 反转依赖于 end() 的迭代器
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 'string'文件在带有C++文件的iOS插件上找不到
- 在 ifcondition al中 find() C++ STL 中的 == a.end() 有什么用?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 了解向量中的 .begin 和 .end
- 如何实现链表的 end()?
- 使用 map.end() 访问 map 的最后一个元素
- Istream seekg()偏移量和ios::end