Могу ли я сбросить данные неявно?

Есть ли способ неявно сбросить данные в выходной поток?

#include <iostream>
#include <fstream>
using namespace std;

#define log logstream 

int main()
{
  ofstream logstream("test.log");

  log << "Test1" << 123 << endl;     // explicitly flushed
  log << "Test2" << 123;             // ?

  // Test2 not written, yet...

  cout << "Check log file..." << endl;
  int tmp;
  cin >> tmp;
}

Я хотел бы иметь возможность вести журнал без указания манипулятора << endl каждый раз.


person Pietro    schedule 22.09.2016    source источник
comment
Использовать << flush вместо этого?   -  person Ed Heal    schedule 22.09.2016
comment
Для большинства языков довольно стандартно, что потоки вывода сбрасываются при newline или закрытии потока. С++ ничем не отличается. Многие классы ведения журнала реализуют таймер скрыто и принудительно сбрасывают данные по истечении времени таймера.   -  person CAB    schedule 22.09.2016
comment
@EdHeal: это явно, а не неявно.   -  person Jarod42    schedule 22.09.2016


Ответы (1)


Вы можете использовать std::unitbuf.

log << std::unitbuf;

И тогда сброс будет выполняться при каждой вставке.

person Jarod42    schedule 22.09.2016
comment
То есть для лог-потока надо один раз указать log << std::unitbuf;, и тогда сразу все сбросится? А другие потоки останутся незатронутыми? - person Pietro; 22.09.2016
comment
сброс будет выполняться при каждой вставке Это звучит невероятно неэффективно :/ - person πάντα ῥεῖ; 22.09.2016
comment
@ πάνταῥεῖ - Да, но это может быть полезно для ведения журнала, когда вы обычно не выполняете буферизацию. - person Pietro; 22.09.2016
comment
@Pietro: это относится только к потоку log. - person Jarod42; 22.09.2016
comment
@ Jarod42: это применимо к любому выходному потоку, например: std::cout << std::unitbuf; - person Pietro; 23.09.2016
comment
@Pietro: я имею в виду, что log << std::unitbuf; не изменяет поведение std::cout, и действительно, вы также можете использовать std::cout << std::unitbuf; для воздействия на std::cout. - person Jarod42; 23.09.2016