gpt4 book ai didi

c++ - 明确输入/输出流和输入/输出缓冲区的区别

转载 作者:行者123 更新时间:2023-11-28 04:35:51 25 4
gpt4 key购买 nike

已编辑

输入流和输入缓冲区

据我了解,当按下键盘上的某个键时,字符会进入输入流 (stdin) 并存储在缓冲区中。然后 scanf(在 C 的情况下)或 cin(在 C++ 的情况下)从缓冲区中提取字符并将其放入主内存。

输出流和输出缓冲区

同样,在屏幕上显示字符之前,它们首先存储在缓冲区中。然后 printf(在 C 的情况下)或 cout(在 C++ 的情况下)从缓冲区中提取字符(当缓冲区已满时)并将其发送到输出(stdout)流。

我说的对吗?我已经坚持了很长一段时间,我的逻辑可能有缺陷。

最佳答案

旁注:scanf() 不是读取 输入的函数,see more here .


现在回答您的问题:在询问 C(和 C++)等语言时,您应该停留在该语言提供的抽象概念范围内。所以,不要从键盘开始,那离你的程序很远。

从这里开始:操作系统想要向您提供一些输入。现在,您的 C 运行时为您的代码提供了一个 输入。 stream 是一个抽象的概念,它只是表示您可以持续阅读的内容。该流可以是缓冲的或非缓冲的,如果它是缓冲的,则有不同的模式(完全缓冲或行缓冲)可用。您可以配置所有这些。

如果您的流是无缓冲的,这意味着操作系统必须等到您的代码想要从输入流中读取。默认情况下,您的标准输入流是行缓冲,这意味着您的 C 运行时会立即接受输入并将其放入缓冲区,直到出现换行符——您的代码调用输入函数将从那个缓冲区。

从概念上讲,输出也是如此,只是反过来。例如,如果您的输出流是行缓冲的,您的 C 运行时将填充一个缓冲区,直到有一个换行符并将整行传递给操作系统以供输出。如果输出是无缓冲的,每个字符都会立即传递给操作系统。


免责声明:这仍然有很多简化,但应该足够开始了。


当您在评论中询问术语“缓冲区溢出”时,提到了 gets() -- 这是关于您自己的代码<中的缓冲区/强>。对于读取多个值/字符的任何输入函数,您必须为其提供自己的缓冲区来存储结果。使用 gets(),没有办法告诉函数这个缓冲区有多大,所以只要可用输入太大,它就会溢出。这就是为什么 gets() 定义错误并同时从 C 语言中删除的原因。它与可能在 I/O 流的实现中使用的 C 运行时缓冲区无关。

关于c++ - 明确输入/输出流和输入/输出缓冲区的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51458342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com