2

在 GameDev.net 上阅读这篇文章后,我决定看一看 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()没有的话,文本/二进制模式之间的差异将不那么显着)。但在另一个程度上,它似乎……不一致。我认为我的部分困惑和观察到的不一致可能来自我对“未格式化输入函数”的明显误解。

4

1 回答 1

2

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

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

于 2013-04-01T05:44:30.117 回答