2012-03-09 6 views
2

У меня есть следующий код:C++ - ofstream не выводятся в файл, пока не закроете программу

ofstream mOutFile.open(logPath, ios_base::app); 
    string lBuilder; 

    lBuilder.append("========================================================\n"); 
    lBuilder.append("Date: "); 
    lBuilder.append(asctime(timeinfo)); 
    lBuilder.append("\n"); 
    lBuilder.append("Log Message:\n"); 
    lBuilder.append(toLog); 
    lBuilder.append("\n"); 
    lBuilder.append("========================================================\n\n"); 

    int lSize = lBuilder.size(); 
    char* lBuffer = new char[lSize]; 
    int index = 0; 
    for each (char c in lBuilder) 
     lBuffer[index++] = c; 

    mOutFile.write(lBuffer, lSize); 
    mOutFile.flush(); 

К сожалению, пока я не закрыть приложение (я предполагаю, что закрытие ofstream будет работать, а) вывод не записывается в текстовый файл. Я знаю, что, возможно, я могу закрыть и снова открыть поток, и все будет «просто работать», но это кажется глупым и неправильным решением. Что я здесь делаю неправильно?

Я также попытался следующие варианты, основанные на других вопросов, которые я нашел здесь, но эти решения не работают:

mOutputFile << flush; 
mOutputFile << endl; 

Заранее спасибо за любую помощь по этому вопросу.

Редактировать Все в этом коде работает на Visual C++, оно строит и отлично работает, за исключением того, что файл не записывается до тех пор, пока поток не будет закрыт, даже если я заставлю флеш. Кроме того, я переключился с использования оператора < < на char * и .write(), чтобы увидеть, что-то по-другому.

+2

Зачем нужен синтаксис: 'для каждого (char c в lBuilder)'. Это недействительно C++. –

+0

Есть ли причина, по которой вы не используете << для записи строк в файл? – ebutusov

+0

'для каждого' кажется C# ism. Также попробуйте закрыть дескриптор файла после его очистки и посмотреть, помогает ли это. –

ответ

1

Я в конечном итоге просто «заставить его работать» путем закрытия и повторного открытия потока после операции записи.

mOutputFile << "all of my text" << endl; 
mOutputFile.close(); 
mOutputFile.open(mLogPath); 

EDIT осел принуждая флеш на несколько других системах, это выглядит как-то просто не исполняющее правильно на моей машине развития. Не хорошие новости, но, по крайней мере, вышеприведенное решение, похоже, срабатывает, когда программная очистка потока не срабатывает. Я не уверен в значениях вышеупомянутого кода, хотя, если кто-то хочет перезвонить, если есть последствия закрытия и повторного открытия потока, как это.

+0

то что-то не так с вашим компьютером – 111111

+0

выглядит так: флеш отлично работает на других системах. –

+0

- это файл, открытый другим процессом или что-то в этом роде (в среде * NIX вы можете использовать lsof) , – 111111

7
std::ofstream file(logPath, ios_base::app); 

file << "========================================================\n" 
    << "Date: " << asctime(timeinfo) 
    << "\nLog Message:\n" << toLog 
    << "\n========================================================\n\n" 
    << std::flush; 
    //if you want to force it write to the file it will also flush when the the file object is destroyed 
//file will close itself 

Это не только легче читать, но это, вероятно, также может быть быстрее, чем ваш метод + это более стандартный appraoch

+0

Я дам этот снимок, когда я нахожусь в офисе завтра –

+1

Это не сработало, я решил просто «заставить его работать», я отправлю свое решение через несколько минут. –