在GameDev.net上阅读this post后,我决定采用C ++标准。有几个std::istream
函数被标准描述为“无格式输入函数”(如tellg()
,read()
等)。一直以来,我曾想过“无格式输入函数”意味着当使用“无格式输入函数”时(无论文本模式还是二进制模式),在阅读时(例如"\r\n" -> "\n"
)不会格式化文本。显然,事实并非如此,因为read()
方法仍将转换"\r\n" -> "\n"
(如果未指定std::ios_base::binary
),尽管它是“未格式化的输入函数”。
现在我很困惑,因为我显然不理解正确的事情。 “未格式化的输入函数”究竟是什么意思?是的,我读过第27.7.2.3节第1段,它似乎更多地讨论了处理错误而不是其他任何东西(当然,这是可能的)我没有正确理解它,这可能是问题的一部分。)
我刚刚发现tellg()
未考虑格式转换的事实,而read()
确实令人困惑。在某种程度上,它是有意义的(如果tellg()
那么它将是O(n),如果read()
没有,那么文本/二进制模式之间的差异就不那么重要了。但在另一个程度上,似乎......不一致。我认为我的一些困惑和观察到的不一致可能来自于我对“无格式输入功能”的明显误解。
答案 0 :(得分:2)
未格式化的函数意味着该函数将流视为char
的序列,即使它是double
或int
。例如,如果流有8.7
,则未格式化的函数read
会将其读作'8'
,'.'
,'7'
的序列,并将其存储在类型char*
的缓冲区。
另一方面,格式化的函数将尝试将未格式化的缓冲区格式化为给定类型。如果给定的类型为double
,那么您将获得8.7
。如果无格式化数据无法格式化为给定类型,则该函数会将流状态设置为failbit
。