В попытке реализовать freopen () я натолкнулся на часть спецификации в стандарте, которая, насколько я вижу, фактически ничего не указывает.
Итак ... freopen()
закроет поток (игнорируя ошибки), очистит его ошибку и флаг EOF, сбросит широкую ориентацию, а затем снова откроет поток в заданном режиме. Это очень ясно; это в основном fclose () / fopen (). Даже если это не определено таким образом, довольно ясно, что это было то, что было задумано.
Однако у меня есть два вопроса относительно того, что setvbuf()
могло бы сделать с настройкой потока пользовательский буфер и / или изменение политики буфера.
Вопрос 1.
1) Ожидается ли freopen()
возврат к значениям по умолчанию состояние, как если бы оно на самом деле называется fopen()
? Или ожидается, что он перенесет в новый поток все, что пользователь установил с помощью setvbuf()
на старом? Это относится как к буферной памяти, так и к политике буфера, но основная проблема здесь связана с буферной памятью.
Спецификация для fclose()
указывает, что любой буфер, связанный с потоком через setvbuf()
, который пользователь связал с потоком, т.е. теперь может быть free()
'd пользователем.
Но freopen()
указывает только то, что закрывает файл, связанный с потоком, но не fclose()
его.
Итак, после freopen()
остается ли связанная с пользователем буферная память связанной с потоком?
Вопрос 2.
freopen()
предположительно может использоваться в FILE
структуре, которая на самом деле не связана с открытым файлом во время вызова (поскольку ошибки при попытке закрыть файл должны игнорироваться).
Эта файловая структура может ранее был открытый поток с назначенной пользователем буферной памятью и политикой буфера. freopen()
для соблюдения этих настроек, т. Е. Повторно связать буферную память / политику с "re" -открытым файлом, или это для переустановки структуры по умолчанию, предполагая, что пользователь free()
d буферной памяти после fclose()
файл ранее?
Мое взятие.
Глядя на Q2, я не вижу способа для стандартной библиотеки надежно определить, является ли не открытая в настоящее время структура FILE
с выделенной пользователем буферной памятью все еще «владеет» этой буферной памятью, или же пользователь уже освободил эту память. (Возможно, эта память может быть локальной, то есть не входить в списки памяти, обрабатываемые malloc()
/ free()
, даже если бы я был готов go там - и это было бы весьма нехарактерно сложной работой, ожидаемой от функций стандартной библиотеки .)
Аналогичные соображения для политики буфера.
Так что, насколько я вижу, единственный надежный способ обработки вещей - это freopen()
для обработки закрытие «любого файла, связанного с указанным потоком» как «реального» * 1064 *, и переустановка буферной памяти / policyto default.
Прав ли я в этом понимании, или есть альтернатива? ответ на Q1 / Q2?