在C++中,"var << ifstream"与"ifstream >> var"相同吗?
In C++, is `var << ifstream` the same as `ifstream >> var`?
var << ifstream
和ifstream >> var
一样吗?
据我所知,它们应该完全相同。但是已经很晚了,我的大脑半睡半醒,所以我想澄清一下。
它们不一样。 foo << bar
是foo.operator<<(bar)
或operator<<(foo, bar)
,而bar >> foo
是bar.operator>>(foo)
或operator>>(bar, foo)
。
它们只是不同的东西。这些版本是否存在,更不用说如果存在两个版本,它们是否执行相同的操作,完全取决于代码中的内容。
对于标准 iostream,通常只为某些用户定义的类型T
定义了以下两个自由函数,而没有其他函数:
std::ostream & operator<<(std::ostream &, T const &); // for "os << x"
std::istream & operator>>(std::istream &, T &); // for "is >> y"
No. 它们调用完全不同的函数。 一个叫operator >>
,另一个叫operator <<
。 此外,两者的论点不同。
这类似于询问F(int,double)
是否与称呼Q(double, int)
相同 - 也许,也许不是 - 尽管我可以看到为什么这对刚接触该语言的人来说不是很明显。 您首先需要意识到重载运算符没有什么特别的,它们只是函数调用。
除非var
定义了<<
运算符或将其定义为自由函数,否则前者无效。
不,这不是一回事。约定是流参数始终位于<<
>>
运算符的左侧,要读取/写入的值位于右侧。这有一个很好的理由:这些运算符可以像
std::cout << "Hello" << ',' << " world";
(它的工作原理类似于 istream
s)这里发生了什么:<<
运算符是左关联的,所以我们有
((std::cout << "Hello") << ',') << " world";
类型在哪里
std::cout : std::ostream
(std::cout << "Hello") : std::ostream
((std::cout << "Hello") << ',') : std::ostream
因此,每次调用一个operator<<(stream, value)
,都会给出所需的结果。现在你想要的是扭转整个事情,比如
" world" >> ',' >> "Hello" >> std::cout;
乍一看,它应该做同样的事情。但它没有,因为这现在解析
为((" world" >> ',') >> "Hello") >> std::cout;
你从operator>>(const char*, char)
开始的地方.现在这个运算符如何知道结果最终会放在std::ostream
中?
这里有一个小提示,表明两个表达式并不相同。运算符也可以通过非常丑陋的语法调用。亲眼看看:
var << ifstream;
等于
var.operator<<(ifstream);
和
ifstream >> var;
等于
ifstream.operator>>(var);
编辑:在下面的评论提醒之后 - 还有第三种选择。 运算符>>也可以实现为函数:
returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);
由于签名不匹配,因此它们的实现方式可能不同。
马蒂亚斯。
需要做的是查看ifstream
的文档,并查看仅定义了operator>>
。
- ifstream什么都没读
- EASTL矢量<向量<int>>连续的
- ifstream文件在从行中读取时被清除
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 将 ifstream 拆分为 n 个流?
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 是否可以在没有真实文件的情况下创建 ifstream
- 虽然循环不读取整个 ifstream 文件
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- Ofstream和IFSTREAM有什么区别?
- 如何将QByteArray转换为std::istream或std::ifstream?
- ifstream 跳过数字,只写 0
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 在函数中声明的 ifStream 对象在发布模式下不起作用
- fstream / ifstream / ofstream 对象如何转换为布尔值
- ifstream 尝试读取 9 到 13 之间的无符号字符时非常奇怪的行为
- 尝试在 C++ 中为 ifstream 提供一个变量
- ifstream 读取的字符与文件中写入的字符不同