在一些使用std :: ofstream执行大量文件i / o的代码中,我正在缓存流以提高效率.但是,有时我需要更改文件的openmode(例如append vs truncate).这是一些类似的模拟代码:
class Logger {
public:
void write(const std::string& str, std::ios_base::openmode mode) {
if (!myStream.is_open) myStream.open(path.c_str(), mode);
/* Want: if (myStream.mode != mode) {
myStream.close();
myStream.open(path.c_str(), mode);
}
*/
myStream << str;
}
private:
std::ofstream myStream;
std::string path = "/foo/bar/baz";
}
有谁知道:
>有一种方法可以改变ofstream的开放模式吗?
>如果没有,有没有办法找出当前的ofstream开放模式是什么,所以我可以关闭并仅在必要时重新打开它?
最佳答案 @Ari由于默认实现不允许你想要的东西,你可能必须封装ofstream并提供额外的get / set开放模式功能,在这个功能中你的新对象将模拟所需的行为.
也许是这样的
class FileOutput{
private:
ostream& streamOut;
std::ios_base::openmode currentOpemMode;
public:
FileOutput(ostream& out, std::ios_base::openmode mode)
: streamOut(out), currentOpemMode(mode){}
void setOpenMode(const std::ios_base::openmode newOpenMode){
if(newOpenMode != currentOpemMode){
currentOpemMode = newOpenMode;
updateUsedMode();
}
}
private:
void updateUsedMode(){
if(currentOpemMode == ios_base::app){ /* use seekg/tellg to move pointer to end of file */}
else if(currentOpenMode == binary){ /* close stream and reopen in binary mode*/}
//...and so on
};