“无格式输入功能”究竟是什么意思?

时间:2013-04-01 05:37:10

标签: c++

在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()没有,那么文本/二进制模式之间的差异就不那么重要了。但在另一个程度上,似乎......不一致。我认为我的一些困惑和观察到的不一致可能来自于我对“无格式输入功能”的明显误解。

1 个答案:

答案 0 :(得分:2)

未格式化的函数意味着该函数将流视为char的序列,即使它是doubleint。例如,如果流有8.7,则未格式化的函数read会将其读作'8''.''7'的序列,并将其存储在类型char*的缓冲区。

另一方面,格式化的函数将尝试将未格式化的缓冲区格式化为给定类型。如果给定的类型为double,那么您将获得8.7。如果无格式化数据无法格式化为给定类型,则该函数会将流状态设置为failbit