考慮實施stream buffer(可作爲參數傳遞)。當你需要緩衝區上的I/O時,在其上創建一個std :: istream或std :: ostream。
這種方法可以讓你有機會獲得正確格式化的I/O使用std::[i/o]stream
與您進行任何努力(即你只需要定義什麼增加或從流手段越來越字節,而不是格式化。
代碼應該是這樣的:
class ResourceStream: public std::streambuf {
... // you implement this
};
virtual Resource parseStream(std::streambuf * streambuf)
{
std::istream in(streambuf);
Resource r;
in >> r; // assumes an std::istream& operator>>(std::istream&in, Resource& r)
// is defined
if(in >> r)
return r;
else
throw std::runtime_error{"bad stream for parsing resource"};
}
編輯:
在第二次看,這似乎是在xy問題。正確的解決方案是定義I/O運營商爲您的資源類:
你需要寫什麼:
class Resource {
// ...
};
std::istream& operator >> (std::istream& in, Resource& r) {
return in after reading from it
}
std::ostream& operator << (std::ostream& out, const Resource& r) {
return in after writing into it
}
在模型中ResourceStream對象將是一個std :: ifstream的對文件所在的文件打開和你的ResourceManager看起來就像這樣:
// boost::path can be replaced by std::string containing the file path
virtual boost::path FileLocator::locateFile(const String &name);
// locate file and get resource:
auto path = locator.locateFile("serializedresource.data");
std::ifstream input(path);
Resource r;
if(input >> r)
// r was read correctly
else
// stream does not contain a serialized r/throw an exception
我真的很喜歡實現我自己的流緩衝區的想法,但如果我打算使用std :: [i/o] fstream,使用'basic_filebuf'會更有意義嗎?另外,當文件被加載爲二進制文本或文本或其fstream作業將其「解析」爲文本或二進制文件時,streambuf會發生變化嗎?我仍然在研究和閱讀關於streambuf,因爲我從來沒有使用過任何經驗。 – Gasim
streambuf是二進制的。從字節轉換爲格式化數據是流的職責(在緩衝區之上)。 – utnapistim