C++ 澄清输入/输出流和输入/输出缓冲区之间的区别
已编辑 输入流和输入缓冲区 据我所知,当按下键盘上的键时,字符进入输入流(stdin)并存储在缓冲区中。然后scanf(在C的情况下)或cin(在C++的情况下)从缓冲区中提取字符并将其放入主内存中 输出流和输出缓冲区 类似地,在字符显示在屏幕上之前,它们首先存储在缓冲区中。然后printf(对于C)或cout(对于C++)从缓冲区中提取字符(当缓冲区已满时),并将其发送到输出(stdout)流 我说得对吗?我已经在这个问题上纠缠了很长一段时间,我的逻辑可能有缺陷。旁注:C++ 澄清输入/输出流和输入/输出缓冲区之间的区别,c++,c,C++,C,已编辑 输入流和输入缓冲区 据我所知,当按下键盘上的键时,字符进入输入流(stdin)并存储在缓冲区中。然后scanf(在C的情况下)或cin(在C++的情况下)从缓冲区中提取字符并将其放入主内存中 输出流和输出缓冲区 类似地,在字符显示在屏幕上之前,它们首先存储在缓冲区中。然后printf(对于C)或cout(对于C++)从缓冲区中提取字符(当缓冲区已满时),并将其发送到输出(stdout)流 我说得对吗?我已经在这个问题上纠缠了很长一段时间,我的逻辑可能有缺陷。旁注:scanf()不是读取输
scanf()
不是读取输入的函数
现在回答你的问题:当问C(和,C++)时,例如语言,你应该停留在语言提供的抽象概念之内。所以,不要从键盘开始,那远远超出了你的程序 从这里开始:操作系统希望向您提供一些输入。现在,您的C运行时为您的代码提供了一个输入流。流是一个抽象的概念,它只意味着你可以不断地从中阅读。这个流可以是缓冲的,也可以是非缓冲的,如果它是缓冲的,则有不同的模式(完全缓冲或行缓冲)可用。您可以配置所有这些 如果您的流没有缓冲,这意味着操作系统必须等待,直到您的代码想要从输入流读取。默认情况下,您的标准输入流是行缓冲的,这意味着您的C运行时立即接受输入并将其放入缓冲区,直到出现换行符——您的代码调用输入函数将从该缓冲区获得结果 从概念上讲,输出也会发生同样的情况,只是反过来。例如,如果您的输出流是行缓冲的,那么您的C运行时将填充一个缓冲区,直到有一个换行符,并将整个行交付给操作系统进行输出。如果输出是无缓冲的,则每个字符都会立即传递到操作系统
免责声明:这仍然是一个很大的简化,但应该足够开始
当您询问注释中的术语“缓冲区溢出”时,提到
get()
——这是关于您自己的代码中的缓冲区。对于任何读取多个值/字符的输入函数,您必须为其提供自己的缓冲区以将结果存储到。使用gets()
,无法告诉函数这个缓冲区有多大,因此只要可用的输入太大,它就会溢出缓冲区。这就是为什么gets()
定义错误,同时从C语言中删除。它与C运行时的缓冲区无关,这些缓冲区可能用于I/O流的实现。旁注:scanf()
不是读取输入的函数
现在回答你的问题:当问C(和,C++)时,例如语言,你应该停留在语言提供的抽象概念之内。所以,不要从键盘开始,那远远超出了你的程序 从这里开始:操作系统希望向您提供一些输入。现在,您的C运行时为您的代码提供了一个输入流。流是一个抽象的概念,它只意味着你可以不断地从中阅读。这个流可以是缓冲的,也可以是非缓冲的,如果它是缓冲的,则有不同的模式(完全缓冲或行缓冲)可用。您可以配置所有这些 如果您的流没有缓冲,这意味着操作系统必须等待,直到您的代码想要从输入流读取。默认情况下,您的标准输入流是行缓冲的,这意味着您的C运行时立即接受输入并将其放入缓冲区,直到出现换行符——您的代码调用输入函数将从该缓冲区获得结果 从概念上讲,输出也会发生同样的情况,只是反过来。例如,如果您的输出流是行缓冲的,那么您的C运行时将填充一个缓冲区,直到有一个换行符,并将整个行交付给操作系统进行输出。如果输出是无缓冲的,则每个字符都会立即传递到操作系统
免责声明:这仍然是一个很大的简化,但应该足够开始
当您询问注释中的术语“缓冲区溢出”时,提到
get()
——这是关于您自己的代码中的缓冲区。对于任何读取多个值/字符的输入函数,您必须为其提供自己的缓冲区以将结果存储到。使用gets()
,无法告诉函数这个缓冲区有多大,因此只要可用的输入太大,它就会溢出缓冲区。这就是为什么gets()
定义不正确,同时从C语言中删除。它与C运行时的缓冲区无关,这些缓冲区可能用于实现I/O流。从抽象意义上讲,流是输入数据的任何连续源或输出数据的通道。流不一定是缓冲的(例如GPIO引脚上的模拟传感器),缓冲区只是可能与流无关的数据块(例如位图的光栅缓冲区)。C++中的STD流类型也不一定是缓冲的。对于C和C++标准库所使用的流,基本上是正确的。@ DAI标准输入和输出流被缓冲。这里有点混乱。例如,人们建议在将字符串作为输入时使用fgets()函数而不是gets()函数,因为gets()可能会导致输入缓冲区溢出。缓冲区在这个上下文中是什么意思?在这个上下文中,它指的是char
的数组,即fgets