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

时间:2011-08-22 19:29:54

标签: c++ c

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

  

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

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

  

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

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

  

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

答案 1 :(得分:3)

Formatted 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的数据 - 如果没有你的机器内存不足,这就不适合单个字节数组。这就是为什么流式传输允许您一次一个地处理较小块的数据,一个接一个地处理数据,以便在任何给定时间您只需要处理大小固定的数据量。您一遍又一遍地将数据读入辅助变量并进行处理,直到您的基础流告诉您已完成且没有剩余数据。

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

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

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

答案 2 :(得分:0)

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