我有一些代码使用ifstream
从文件中读取一些数据,一切正常。
现在我希望在不修改某些代码的情况下从内存中读取这些数据,实际上我有一个包含数据的char *
...
如果没有有效阅读文件,如何将char *
数据放入ifstream
?
答案 0 :(得分:8)
标准库提供了一个也可写的内存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
答案 1 :(得分:7)
如果可以稍微更改使用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);
答案 2 :(得分:7)
虽然使用了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);
对于小范围的内存,差异可能并不重要,尽管保存的分配也可以在那里显着。对于大块内存,它会产生很大的不同。
答案 3 :(得分:1)
您可能正在搜索字符串流。 http://www.cplusplus.com/reference/sstream/stringstream/。我之前只使用过一次并且已经很长时间了,但基本上你可以从内存中的位置流式传输。
答案 4 :(得分:0)
在我的项目中,我使用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;
}