проблема сброса printf - PullRequest
0 голосов
/ 09 июня 2011

Я модифицирую большой C-код. В целях тестирования мне пришлось перенаправить стандартный вывод в файл. Я использовал этот код для этой цели: fp=freopen("OUT", "w" ,stdout) Теперь все вызовы printf будут записываться в fp. Это большой код, поэтому я не хочу искать все точки выхода и закрывать файл перед каждым выходом. Что произойдет, если не закрыть файл? Есть ли способ сделать это автоматически каждый раз, когда я что-то записываю в файл?

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

setvbuf, вероятно, способ пойти:

setvbuf (fp, NULL, _IONBF, 0);

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

Вы также должны знать, что во многих системах это будет сбрасываться только на уровне библиотеки времени выполнения, это не обязательно приведет к сбросу на носитель данных, так какUNIX fsync(fileno(fp)) попытается это сделать.

Так что, если ваша программа выйдет из строя, все будет в порядке, но не поможет, если вся ОС окажется в кричащей куче.Но тогда у вас, вероятно, есть большие проблемы, чем небольшая потеря вывода: -)


Но, если ваша программа не вызывает сбой , вам, вероятно, не стоит беспокоиться об этом.ISO C99 говорит, частично, что одно из действий exit() и, следовательно, возврат от main(), это:

Затем все открытые потоки с неписанными буферизованными данными сбрасываются, все открываютсяпотоки закрыты, ...

Таким образом, ваши данные будут выводиться независимо от этого.

1 голос
/ 09 июня 2011

Да. Используйте setvbuf с _IONBF:

setvbuf(stdout, 0, _IONBF, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...