2014-12-04 3 views
-1
#include<stdio.h> 
#define DEBUG 
int main() 
{ 
    #ifdef DEBUG 
    freopen("ddd.txt","a",stdout); 
    freopen("ddd.txt","a",stderr); 
    #endif 
    printf("1\n"); 
    perror("2"); 
    printf("3\n"); 
    perror("4"); 
    printf("5\n"); 
    perror("6"); 
} 

Как @JonathanLeffler нот, на 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 

Почему странный заказ?

Кроме того, perror возвращает «неверный аргумент» как ошибку. Можно ли использовать freopen в том же файле?

+3

Что вы можете задать здесь? – Kelm

+0

Угадай, что вопрос был неправильно отформатирован, и что ему нужно знать, «безопасно ли использовать freopen в том же файле?» – cwap

+0

Пожалуйста, включите всю информацию в свой вопрос, * включая вывод, который вы хотели бы пояснить *. Ответчикам не нужно пересматривать свой вопрос. :-) – HostileFork

ответ

2

Выход я на 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(). Это уменьшит объем нечетного вывода.

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