Выход я на Mac OS X 10.10.1 с GCC 4.9.1 является:
2: Undefined error: 0
4: Undefined error: 0
6: Undefined error: 0
1
3
5
Последовательность так потому, что стандартная ошибка не помещаются в буфер и стандартный вывод в буфер.
Могло быть любое количество причин, по которым вы получаете ошибку EINVAL, Invalid argument. Если freopen()
не указала ошибку, у вас нет причины проверять значение в errno
; библиотечным функциям разрешено устанавливать errno
, даже когда они преуспевают. (Например, в Solaris многие операции вывода оставят errno
установленным в ENOTTY, а не tty, когда выход был чем-то другим, кроме терминала, хотя операция была успешной.)
Обратите внимание, что вы должны строго , проверьте, что возвращаемое значение от freopen()
не является NULL перед использованием потока. Вызов может потерпеть неудачу, если файл не может быть создан или не доступен для записи или является каталогом, и т.д.
И Ваш вопрос:
Безопасно ли использовать freopen на том же файле?
Это зависит от вашего определения «безопасный». Будет ли ваш компьютер взорваться? Нет, не только из-за этого. Будет ли freopen()
сбой при второй попытке? Нет, нет. Не могли бы вы получить интересные эффекты чередования с данными? Да, конечно. Блоки стандартного вывода, не обязательно заканчивающиеся на новую линию, могут легко чередоваться с линиями стандартной ошибки. Вы часто это делаете? Нет, вы не часто это делаете. И если вы это сделаете, вы можете установить как стандартный вывод, так и стандартную ошибку для строки с буферизацией setvbuf()
сразу же после вызовов freopen()
. Это уменьшит объем нечетного вывода.
Что вы можете задать здесь? – Kelm
Угадай, что вопрос был неправильно отформатирован, и что ему нужно знать, «безопасно ли использовать freopen в том же файле?» – cwap
Пожалуйста, включите всю информацию в свой вопрос, * включая вывод, который вы хотели бы пояснить *. Ответчикам не нужно пересматривать свой вопрос. :-) – HostileFork