Измените или проверьте openmode std :: ofstream

В некотором коде, который делает много файлового ввода-вывода, используя std::ofstreamКеширую поток для эффективности. Однако иногда мне нужно изменить 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?
  • Если нет, есть ли способ узнать, что в настоящее время openmode из ofstream так ли я могу закрыть и открыть его только тогда, когда это необходимо?

4

Решение

@Ari Поскольку реализация по умолчанию не позволяет выполнять то, что вы хотите, вам, возможно, придется инкапсулировать ofstream и предоставить дополнительную функциональность режима get / set open, в которой ваш новый объект будет имитировать желаемое поведение.

Может быть, что-то вроде этого

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
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]