我有一些代碼使用ifstream
從文件中讀取一些數據,並且一切正常。C++使用從內存中的ifstream
現在,我想,而不需要修改一些代碼,從存儲器讀取這些數據,其實我有一個char *
包含數據...
我怎樣才能把我的char *
數據爲ifstream
沒有有效的閱讀文件?
我有一些代碼使用ifstream
從文件中讀取一些數據,並且一切正常。C++使用從內存中的ifstream
現在,我想,而不需要修改一些代碼,從存儲器讀取這些數據,其實我有一個char *
包含數據...
我怎樣才能把我的char *
數據爲ifstream
沒有有效的閱讀文件?
如果使用該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
您可能正在搜索stringstream。 http://www.cplusplus.com/reference/sstream/stringstream/。我以前只用過一次,這已經很長時間了,但基本上可以從內存中的某個位置進行流式傳輸。
雖然使用了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);
對於記憶的差異可能無所謂雖然保存的分配可以noticable有一小塊區域,太。對於大塊內存來說,這是一個很大的區別。
在我的項目中,我使用iostream的write()和read()方法,因爲我將二進制數據寫入到一個stringstream中。對不起,下面的代碼沒有經過測試,並可能語法錯誤(從辦公室打字... ;-),但這樣的事情可以讓你寫入內存,文件和其他地方(如網絡套接字):
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;
}
[設置標準流使用的內部緩衝區(pubsetbuf)]的可能的重複(http://stackoverflow.com/questions/1494182/setting-the-internal-buffer-used-by-a-standard-stream-pubsetbuf) –