Javier Luis Lopez Ответов: 2

Проблема Setvbuf() при превышении скорости консоли


Для того чтобы использовать консольный вывод в windows, рекомендуется использовать setvbuf().
Моя проблема заключается в том, что после создания буфера cout не работает в вызываемых функциях.

Мне пришлось вставить в следующую программу в main() строку:
cout<<"=== FIN ==="<<endl;


Так:
1. Как заставить писать at cout внутри функции?
2. Что произойдет, если размер записи больше размера буфера?

Что я уже пробовал:

<pre>#include <iostream>
using namespace std;
void test1(){cout<<" function ini"<<endl;} //" function ini" is not written here

int main()
{
#ifndef __linux__   //Introduce this code at the beginning of main() to increase a lot the speed of cout in windows: 
	char buffer_setvbuf[1024];setvbuf(stdout, buffer_setvbuf, _IOFBF, sizeof buffer_setvbuf); 
#endif

	cout<<"=== INI ==="<<endl;
	test1();
	cout<<"=== FIN ==="<<endl;
}


Примечание: Я также попытался установить buffer_setvbuf[] в качестве глобальной переменной с теми же результатами.

Richard MacCutchan

Зачем вам это нужно, какую проблему вы пытаетесь решить?

Javier Luis Lopez

Поскольку printf и cout очень медленны в windows, как можно видеть здесь: https://stackoverflow.com/questions/11558540/c-why-is-a-fprintfstdout-so-slow как сказал CPallini

2 Ответов

Рейтинг:
19

CPallini

вывод не отображается до тех пор, пока не будет достигнута длина буфера (или вывод не будет сброшен), см. ответ здесь: C: почему fprintf(stdout,....) такой медленный? - переполнение стека[^].

Цитата:
1. Как заставить писать at cout внутри функции?

Я бы сохранил политику линейного буфера. С другой стороны, если вы настаиваете на использовании полного буфера, то вам придется явно промыть его cout.


Цитата:
2. Что произойдет, если размер записи больше размера буфера?
Чудесное: по достижении размера буфера содержимое буфера отправляется на экран, и весь буфер затем доступен для дальнейшего вывода.


Javier Luis Lopez

Я проверил пункт 2.
Как лучше смыть Коут?
1. By make cout<<endl; //не работал у меня всегда
2. cout<<"Dataout=..."<<flush;
3. Создание fflush(stdout); непосредственно перед завершением функции

CPallini

Конечно, пункт 1 не должен работать.

Рейтинг:
10

Richard MacCutchan

Видеть Эффект буферизации[^]