当我输入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();
当我输入&lt;包含“123456789”的文件
输出为10 0
现在,如果我这样做:
cin.seekg(ios::end);
int length = cin.tellg();
cout << length << endl;
输出为2
为什么?
答案 0 :(得分:3)
此代码只是偶然使用
cin.seekg(ios::end);
int length = cin.tellg();
cout << length << endl;
值end
来自enum seekdir {beg, cur, end};
,因此ios::end
恰好可以转换为值为2
的整数。
令人遗憾的是,seekg
的一个重载参数是一个整数,因此调用变为cin.seekg(2)
。虽然技术上有效的代码,但这绝对不是你想要的。
答案 1 :(得分:2)
您正在将std::ios_base::seekdir
类型的内容转换为类型std::istream::pos_type
,并调用只需要一个参数的seekg
版本。那个版本的seekg
将指针移动到绝对位置,而不是相对位置。
ios::end
是用于相对偏移的逻辑位置,而不是绝对位置。
答案 2 :(得分:1)
你不能依赖STDIN是可以寻找的。这是因为它可能来自许多来源,包括绝对不可寻找的管道。由于STDIN绑定到文件流,因此重定向文件时可能会有效。我不知道你是否可以依靠它,但这是我的猜测。我甚至都没想过要求STDIN。我一直认为它是一个管道,即使它不是。与STDOUT相同。我不会输出一些东西然后尝试回溯并'覆盖'那个输出。如果您发现自己需要在标准流中寻找,那么您应该重新考虑您的方法。