2010-11-08 5 views
1

Я попытался перенаправить стандартный выход (COUT) в файл, для целей отладкиперенаправить стандартный вывод в файл, используя несколько нити

std::ofstream traceFile; 
traceFile.open("c:/path/file.txt"); 
std::streambuf* fileBuff = traceFile.rdbuf(); 

std::cout.rdbuf(fileBuff); 

std::cout << std::unitbuff; 

std::cout << "disk is written\n"; 

Но вызов COUT из нового потока сделать код застрял на мьютексе. (xmtx.c 39: _Mtxlock()).

У вас есть идея, как я мог ее решить?

Спасибо

ответ

1

example Это прекрасно работает для меня, в то время как ваш тест не делает. На моей машине ваш код, казалось, удвоил поток streambuf из файла, в то время как этот пример свопирует его обратно до вызова деструкторов.

+0

Да, это было глупо, иногда объект outstream выходит за пределы области до того, как новый поток вызывает std :: cout. Думаю, мне нужно больше спать. спасибо – MiniScalope

0

Возможно, вам необходимо сбросить потоковый барабан cout на оригинал.

std::ofstream traceFile; 
traceFile.open("c:/path/file.txt"); 
std::streambuf* fileBuff = traceFile.rdbuf(), *origBuf; 

origBuf = cout.rdbuf(); //Save cout's StreamBuf pointer 
std::cout.rdbuf(fileBuff); //Set cout's StreamBuf to file's StreamBuf pointer 

std::cout << std::unitbuff; 

std::cout << "disk is written\n"; 
cout.rdbuf(origBuf); //Reset cout's StreamBuf back to original 

Кроме того, запись в один и тот же файл несколькими потоками одновременно не допускается. Это может быть причиной отказа в получении мьютекса.

 Смежные вопросы

  • Нет связанных вопросов^_^