c++ - 标准输入流使用的内部缓冲区 (pubsetbuf)
问题描述
我正在尝试设置输入流的内部缓冲区,但我在 C++17 中的实现没有为 istringstream 实现 pubsetbuf()。
我尝试了其他一些技术,但它们速度慢或复制原始缓冲区。我正在寻找一种不进行任何复制的快速方法。
它与关于输出流的这个问题密切相关: 设置标准流使用的内部缓冲区(pubsetbuf)
我已经密切关注它,但输入流的缓冲区仍然未初始化/为空。
// Modified template from the other question about an output stream.
// This is for an input stream, but I can't get it to work.
template <typename char_type>
struct istreambuf : public std::basic_streambuf<char_type, std::char_traits<char_type> >
{
istreambuf(char_type* buffer, std::streamsize buffer_length)
{
// Set the "put" pointer to the start of the buffer and record its length.
this->setp(buffer, buffer + buffer_length);
}
};
int main()
{
ifstream infile(FILENAME, std::ifstream::binary);
if (!infile.is_open())
{
cerr << endl << "Failed to open file " << FILENAME << endl;
return 0;
}
// Works, but slow.
//istringstream local_stream;
//local_stream << infile.rdbuf();
// Works, but creates a copy.
//istringstream local_stream(&buffer[0]);
// Works, but creates a copy.
//local_stream.str(&buffer[0]);
// Read entire file into buffer.
infile.seekg(0, std::ios::end);
streampos length = infile.tellg();
infile.seekg(0, std::ios::beg);
vector<char> buffer(length);
//char* buffer = new char[length];
infile.read(&buffer[0], length);
// Doesn't work, but should point to original.
// It returns "this" (does nothing).
//local_stream.rdbuf()->pubsetbuf(&buffer[0], length);
// Works, but deprecated in C++98.
//std::istrstream local_stream(&buffer[0]);
//local_stream.rdbuf()->pubsetbuf(&buffer[0], length);
// I followed the example in the other question about an output stream,
// but I modified for an input stream. I can't get it to work. Any ideas?
istreambuf<char> istream_buffer(&buffer[0], length);
istream local_stream(&istream_buffer);
string str1, str2;
while (local_stream >> str1 && local_stream >> str2)
{
. . .
}
}
解决方案
我已经解决了!指出不同。
模板 <typename char_type> 结构 istreambuf : 公共 std::basic_streambuf<char_type, std::char_traits<char_type> > { istreambuf(char_type* 缓冲区,std::streamsize 缓冲区长度) { // 将“put”指针设置为缓冲区的开头并记录其长度。 //this->setp(buffer, buffer + buffer_length); // 将“get”指针设置为缓冲区的开头,即下一项,并记录其长度。 this->setg(buffer, buffer, buffer + buffer_length); } };
我需要设置“get”指针,而不是“put”指针。现在效果很好。
推荐阅读
- machine-learning - 波士顿住房数据集的样本提交
- ms-access - 数据类型不正确
- cocoa - 更新暗模式:NSColor 忽略外观变化?
- python - 使用熊猫数据框耗尽内存
- spring-boot - 在 Intellij Idea 上运行 springboot 项目但使用 java 命令运行良好时出现处理 thymeleaf 模板错误?
- jersey-2.0 - 注入 SecurityContext(类似于 Spring 的 SecurityContextHolder)
- python - Django 基于类的视图和 URL 配置
- python - django 应用程序中的要求可能与父级不同吗?
- indexing - Azure 搜索:跨多个索引和/或搜索服务聚合结果
- c++ - WSL 看不到环境变量