Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++_File_Buffer_Streambuf_Filebuf - Fatal编程技术网

C++ 缓冲区如何知道在刷新操作期间要从外部文件传输多少个字符?

C++ 缓冲区如何知道在刷新操作期间要从外部文件传输多少个字符?,c++,file,buffer,streambuf,filebuf,C++,File,Buffer,Streambuf,Filebuf,假设我有一个输入操作: file >> x; 如果文件的内部缓冲区为空,将调用下溢()将字符从外部设备导入文件的内部缓冲区。在执行此刷新操作后,缓冲区是否将被部分或完全填充是由实现定义的。考虑到这一点,如果x是一个字符串,并且我希望输入一个特定长度的值,那么缓冲区是否有可能传输少于该长度的字符?这种情况会发生吗?对于可用的字符数没有实际限制。唯一真正的限制是,尚未达到EOF的流需要至少提供一个字符。具体而言,std::filebuf(或std::basic_filebuf)流可以是

假设我有一个输入操作:

file >> x;

如果
文件
的内部缓冲区为空,将调用
下溢()
将字符从外部设备导入
文件
的内部缓冲区。在执行此刷新操作后,缓冲区是否将被部分或完全填充是由实现定义的。考虑到这一点,如果
x
是一个字符串,并且我希望输入一个特定长度的值,那么缓冲区是否有可能传输少于该长度的字符?这种情况会发生吗?

对于可用的字符数没有实际限制。唯一真正的限制是,尚未达到EOF的流需要至少提供一个字符。具体而言,
std::filebuf
(或
std::basic_filebuf
)流可以是无缓冲的(如果调用了
setbuf(0,0)
),在这种情况下,它确实会使单个字符可用。否则,流将尝试填充其内部缓冲区,并依赖操作系统使底层操作返回适当数量的字节(如果可用的字节还很少)


我不确定我是否完全理解您的问题:
file>>x
操作将在
x
完全读取后返回,如果
file
指示的流已结束或找到空白字符(如果带有“string”,则会发生这种情况)您的意思是
char*
,存储在
file.width()
中的非零值也被考虑在内)。关于底层流缓冲区,显然
x
可能需要对底层表示进行多次读取,也就是说,对
underflow()
的调用次数是不可预测的。考虑到文件的内部缓冲区可能与光盘的块大小相匹配,我希望对“正常”字符串最多调用一次
underflow()
。但是,如果文件读取量很大且不包含任何空格,则可能会调用许多
underflow()
。鉴于流需要找到空白,它无法预测首先需要多少字符。

我不理解布鲁斯大师:我从未研究过streambuf是如何工作的,我也从未计划这样做。但是如果在缓冲区耗尽之前没有找到分隔符,那么
underflow
不会被再次调用以检索更多字符吗?@BenjaminLindley这就是我写这个问题后的想法。