格式化和未格式化的输入和输出以及流

我曾在一些关于格式化和未格式化I / O的网站上阅读过一些文章,但是现在我的思绪更加混乱了。

我知道这是一个非常基本的问题,但我要求任何人都可以给[链接到某些网站或以前在Stackoverflow上回答的问题],这解释了C和C ++中的流的概念。

另外,我想了解Formatted和Unformatted I / O.

格式化IO意味着您的输出由“格式字符串”确定,这意味着您提供了包含某些占位符的字符串,并且您还提供了应该用于填充这些占位符的参数:

const char *daughter_name = "Lisa"; int daughter_age = 5; printf("My daughter %s is %d years old\n", daughter_name, daughter_age); 

示例中的占位符为%s ,表示应使用字符串和%d替换,表示将使用有符号整数替换。 还有更多选项可让您控制最终字符串的显示方式。 作为程序员,这对您来说很方便,因为它可以减轻您将不同数据类型转换为字符串的负担,并且还可以通过strcat或类似方式减轻字符串附加操作的负担。

另一方面,未格式化的IO意味着您只需将字符或字节序列写入流,而不是在执行此操作时使用任何格式字符串。

这带给我们关于流的问题。 “流式传输”背后的一般概念是,您不必一直加载文件或任何输入。 对于小数据,这确实有效,但想象一下你需要处理数TB的数据 – 如果没有你的机器内存不足,这就不适合单个字节数组。 这就是为什么流式传输允许您以较小的块(一次一个,一个接一个地)处理数据,因此在任何给定的时间您只需要处理大小固定的数据量。 您一遍又一遍地将数据读入辅助变量并进行处理,直到您的基础流告诉您已完成且没有剩余数据。

在输出端同样工作,你为步骤编写输出步骤,为块编写块,而不是一次写入整个事物。

这个概念也带来了其他不错的function。 因为您可以在流中的流中嵌套流,所以您可以构建一整个转换链,其中每个流可以修改数据,直到您最终收到最终结果,而不知道单个转换,因为您将流处理为好像有只有一个。

这可能非常有用,例如C或C ++流缓冲它们从例如文件本地读取的数据,以避免不必要的调用并以优化的块读取数据,这样整体性能将比您读取的要好得多直接来自文件系统。

标准没有定义这些术语的含义,它只是说标准中定义的哪些函数是格式化IO而哪些不是。 它对这些function的实现提出了一些要求。

格式化IO只是使用<<>>运算符完成的IO。 它们旨在与数据的文本表示一起使用,它们涉及对正在读取或写入的数据的一些解析,分析和转换。 格式化输入跳过空格:

每个格式化的输入函数通过使用noskipws(第二个)参数false构造类哨兵的对象来开始执行。

未格式化的IO读取和写入数据就像一系列“字符”(可能应用了codecvt语言环境的codecvt )。 它意味着读取和写入二进制数据,或者作为格式化IO实现的低级别。 未格式化的输入不会跳过空格:

每个未格式化的输入函数通过使用默认参数noskipws(second)参数true构造类哨兵的对象来开始执行。

并允许您使用gcount()检索上次输入操作读取的字符数:

返回:为对象调用的最后一个未格式化的输入成员函数提取的字符数。

无格式输入/输出是输入/输出的最基本forms。 无格式输入/输出直接在内存和文件之间传输数据的内部二进制表示。 格式化输出将数据的内部二进制表示forms转换为写入输出文件的ASCII字符。 格式化输入从输入文件中读取字符并将其转换为内部forms。 格式化