C++ std::istream readsome不读取任何内容
C++ std::istream readsome doesn't read anything
就像读书甚至没有读书一样。返回 0 并且不读取任何字符。这是怎么回事?
#include <fstream>
#include <iostream>
int main ()
{
std::fstream stream("list.cpp", std::ios::in);
if (stream.good() || !stream.bad() || stream.is_open()) {
std::cout << "Well, stream looks good." << std::endl;
char justOneChar = 'L';
auto ssize = stream.readsome(&justOneChar, 1);
std::cout << ssize << " : " << justOneChar << std::endl;
}
return -1;
}
输出:
嗯,流看起来不错。0 : L
查阅参考资料,
此函数的行为是高度特定于实现的。例如,当与
std::ifstream
一起使用时,一些库实现会在打开文件后立即用数据填充底层filebuf
(并且此类实现上的readsome()
读取数据,可能但不一定是整个文件),而其他实现仅在请求实际输入操作时从文件读取(并且在文件打开后发出readsome()
从不提取任何字符)。同样,对std::cin.readsome()
的调用可能会返回所有挂起的未处理控制台输入,或者可能始终返回零且不提取任何字符。
简而言之,readsome
相当无用,至少对于标准流而言。这是一个超级非阻塞读取:它只会加载在用户级进程中缓冲的数据,并且永远不会进行内核调用。
auto ssize = stream.readsome(&justOneChar, 1);
1
是要读取的最大字符数。如果流内部缓冲区在调用时为空,则将返回零作为返回值。
以下引用(加粗)显示了这一方面:
streamsize readsome (char* s, streamsize n);
从流中提取多达
n
个字符并将它们存储在s
指向的数组中,一旦关联的流缓冲区对象(如果有)保留的内部缓冲区的字符用完,即使尚未到达文件末尾,也会立即停止。该函数旨在用于从某些类型的异步源读取数据,这些异步源最终可能会等待更多字符,因为它会在内部缓冲区耗尽后立即停止提取字符,从而避免潜在的延迟。
这基本上是一种获取尽可能多的可用字符(受您指定的限制)的方法,而无需等待流提供更多字符。
它不起作用,因为当时可能没有任何字符可供阅读。正如有人提到的那样,它用作非阻塞读取函数,因此这意味着它不会等待输入,这就是为什么它没有要求您输入的原因。因此,要使用它成功读取任何内容,基础缓冲区中必须有一些可用内容。
若要查看在下次调用 readsome 时可以提取的字符数,请使用 in_avail 函数。
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- 为什么ifstream没有读取任何内容
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- C++使用用户名/SID 或备用读取任何窗口用户 HKEY
- C++ 中是否有任何内置阶乘函数?
- 无法使用 QSerialPort 读取任何内容
- 读取任何与PC兼容的赛车方向盘输入
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 套接字记录未读取任何消息
- 在 C++ 中立即设置故障位(在读取任何字节之前)
- 我需要在C /C#中使用图形.我可以使用任何内置的C /C#库
- 是否有任何内置类可以处理C 中的大整数值
- 文件I/O没有读取任何内容
- c ++中是否有任何内置功能可以在计划的时间运行任务
- 是否有任何内置的 UTF 在 c++ 在窗口中
- 逐字节读取任何文件(不是.bin文件)
- C++ std::istream readsome不读取任何内容
- boost::asio::ip::tcp::socket 不读取任何内容
- basic_ifstream<...>::read() 不读取任何内容
- 在VC++2010中执行任何内置的ARRAY函数