2011-08-22 155 views
2

我一直在阅读一些关于格式化和未格式化I/O的网站上的一些文章,但是我现在的想法更加混乱。格式化和未格式化的输入和输出和流

我知道这是一个非常基本的问题,但我会要求每个人都可以得到〔#2到某些网站或先前回答的问题]一个链接,解释说,在C和C++流的想法。

另外,我想了解格式化和未格式化的I/O。

回答

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++流缓冲它们从本地读取的数据。一个文件,以避免不必要的调用,并以优化的块读取数据,这样整体性能将比直接从文件系统读取更好。

5

标准没有定义这些术语的意思,它只是说,它在标准中定义的功能被格式化IO,哪些不是。它对这些功能的实施提出了一些要求。

格式化IO简直就是IO使用<<>>运营商来完成。它们旨在用于数据的文本表示,它们涉及一些正在读取或写入的数据的解析,分析和转换。格式化输入跳过空格:

每个格式化的输入函数都会通过构造一个noskipws(second)参数为false的类哨兵对象开始执行。

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

每个无格式输入功能通过构建类岗哨的目的与默认参数noskipws(第二)参数真正开始执行。

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

返回:要求对象中的最后格式化输入成员函数提取的字符数。

0

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

+0

不明白为什么这个答案是在三年前选择一个已经接受的答案时加入的。这没有添加任何有意义的东西。 – rayryeng