Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 澄清输入/输出流和输入/输出缓冲区之间的区别_C++_C - Fatal编程技术网

C++ 澄清输入/输出流和输入/输出缓冲区之间的区别

C++ 澄清输入/输出流和输入/输出缓冲区之间的区别,c++,c,C++,C,已编辑 输入流和输入缓冲区 据我所知,当按下键盘上的键时,字符进入输入流(stdin)并存储在缓冲区中。然后scanf(在C的情况下)或cin(在C++的情况下)从缓冲区中提取字符并将其放入主内存中 输出流和输出缓冲区 类似地,在字符显示在屏幕上之前,它们首先存储在缓冲区中。然后printf(对于C)或cout(对于C++)从缓冲区中提取字符(当缓冲区已满时),并将其发送到输出(stdout)流 我说得对吗?我已经在这个问题上纠缠了很长一段时间,我的逻辑可能有缺陷。旁注:scanf()不是读取输

已编辑

输入流和输入缓冲区

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

输出流和输出缓冲区

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

我说得对吗?我已经在这个问题上纠缠了很长一段时间,我的逻辑可能有缺陷。

旁注:
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