C ++ ofstream не может писать, если open () находится в другом методе класса - PullRequest
1 голос
/ 03 марта 2012

У меня есть класс FileTransfer, который использует объект ofstream, log. Конструктор класса вызывает open () для объекта ofstream, а logFileName имеет значение по умолчанию в файле .h.

class FileTransfer {
    public:
        FileTransfer(char *logFileName = "client log.txt");
        bool sendFile();
        ofstream log;           // log file
};

FileTransfer::FileTransfer(char * logFileName) {
    this -> logFileName = logFileName;
    // Open log file
    log.open(logFileName);
}

В другом методе класса, sendFile (), я использую поток для регистрации событий.

bool FileTransfer::sendFile() {
    log << "Sender: starting on host " << localhost << endl;
}

Когда у меня так, ничего не записывается в файл журнала. Я попытался проверить log.is_open () и good (), и оба возвращают true.

РЕДАКТИРОВАТЬ:

int main() {
    FileTransfer * ft = new FileTransfer(); // open() is called
    ft -> sendFile(); 
}

Если я вызываю log.open () в методе FileTransfer :: sendFile () непосредственно перед операциями вывода, то вывод работает отлично.

bool FileTransfer::sendFile() {
    log.open(logFileName);
    log << "Sender: starting on host " << localhost << endl;
}

Почему он это делает?

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

ага я знаю в чем у тебя проблема! Вы пишете в файл, но на самом деле он идет в буфер и не очищается в первом случае (это немного случайно).

Добавьте следующую строку после печати:

log.flush();

Это должно исправить вашу проблему.

0 голосов
/ 04 марта 2012

Должен ли конструктор FileTransfer выглядеть следующим образом.

FileTransfer::FileTransfer(char * logFileName) : log( logFileName ) {
}

Таким образом, офстрим построен правильно. И не нужно вызывать open (). Я также думаю, что это лучший дизайн для обработки ошибок и создания объектов.

...