C++ 使用内存中的 IF流
c++ use ifstream from memory
我有一些代码使用ifstream
从文件中读取一些数据,一切正常。
现在我希望,在不修改一些代码的情况下,从内存中读取这些数据,实际上我有一个包含数据的char *
......
如何在不有效读取文件的情况下将char *
数据放入ifstream
中?
尽管使用 std::istringstream
(有时在没有前导i
的情况下错误地引用;这样的类确实存在,但构造成本更高,因为它也设置了一个输出流)非常流行,但我认为值得指出的是,这至少会制作实际字符串的一个副本(我怀疑大多数实现甚至会创建两个副本)。使用简单的流缓冲区可以避免创建任何副本:
struct membuf: std::streambuf {
membuf(char* base, std::ptrdiff_t n) {
this->setg(base, base, base + n);
}
};
membuf sbuf(base, n);
std::istream in(&sbuf);
对于一小部分内存区域,差异可能无关紧要,尽管保存的分配在那里也可以注意到。对于大块内存,它会产生重大差异。
如果使用ifstream&
的代码可以稍微更改为使用istream&
,那么您可以轻松地在ifstream
和istringstream
之间切换(用于从内存中读取数据):
void read_data(std::istream& in)
{
}
来电:
std::istringstream in_stream(std::string("hello"));
read_data(in_stream);
std::ifstream in_file("file.txt");
read_data(in_file);
标准库提供了一个内存中istream
,也是可写的:std::stringstream
。
您需要正确抽象代码,以便它接受泛型istream
而不是ifstream
,构造一个stringstream
,用您的数据填充它并将其传递给函数。
例如:
const char* data = "Hello world";
std::stringstream str((std::string(data))); // all the parens are needed,
// google "most vexing parse"
do_something_with_istream(str); // pass stream to your code
您可能正在搜索字符串流。 http://www.cplusplus.com/reference/sstream/stringstream/。我以前只用过一次,已经很长时间了,但基本上你可以从内存中的某个位置流式传输。
在我的项目中,我使用 iostream 的 write() 和 read() 方法,因为我将二进制数据写入字符串流。抱歉,以下代码未经测试,可能存在语法错误(从办公室打字...;-),但这样的东西允许您写入内存,文件和其他地方(例如网络套接字):
void foo(std::iostream *mystream)
{
mystream.write("Hello", 5);
uint32_t i=5302523;
mystream.write((char*) &i, sizeof i);
}
int main()
{
// Write to memory. stringstream's write() and read() work binary
std::stringstream memstream;
foo(&memstream);
// Write to file
std::fstream f;
try
{
f.open("file.dat");
foo(&f);
}
catch (...)
{
// ...
}
if (f.is_open())
f.close();
return EXIT_SUCCESS;
}
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- C++ 使用内存中的 IF流
- CUDA C++共享内存和 if 条件
- 语句内分配"if"内存,退出时解除分配
- C++ if 语句不起作用(不会读取内存)
- 有必要在释放内存时使用IF语句吗?