2014-01-03 1 views
2

Я знаю, что правильное использование freopen является опустить задание, учитывая это post:Проверьте возвращаемое значение freopen() в C

freopen("/dev/tty","r", stdin);

Мой вопрос, я должен еще проверить возвращаемое значение? Я снова открываю stdin и закрываю все, что было. Например:

if(freopen("/dev/tty","r", stdin)==NULL) { 
    fprintf(stderr, "Unable to redirect stdin from file\n"); 
    exit(1); 
} 
+1

Ну ... почему вы думаете, что он возвращает значение? –

+0

Я думаю, я не знаю, когда и почему он вернет нулевой указатель. – user1024718

+1

вот почему есть страница руководства :) – tristan

ответ

6

Это documentation для freopen говорит:

Если файл успешно открыт, функция возвращает указатель , передаваемый в качестве параметра «поток», который может быть использован для идентификации вновь поток. В противном случае возвращается нулевой указатель. В большинстве библиотек переменная errno также задается системным кодом ошибки при сбое.

Так что да, вы можете проверить возвращаемое значение против NULL, чтобы увидеть, есть ли ошибка или проверить errno.

Что касается Вашего комментария, документация говорит:

Если задано новое имя файла, функция первой попытки закрыть любой файл уже связан с потоком (третий параметр) и разъединяет его. Затем независимо от того, был ли этот поток успешно закрыт или нет, freopen открывает файл, указанный filename, и связывает его с потоком так же, как fopen будет делать с использованием указанного режима.

На основании «независимо от того, был ли этот поток успешно закрыт или нет», представляется возможным, что исходный поток может быть оставлен открытым или в неопределенном состоянии, если есть ошибка. В любом случае, это не будет иметь практических различий, так как вы не захотите использовать поток после того, как freopen все равно сработает.

+0

В каком состоянии находится исходный поток, если возвращается ошибка? – Devolus

+0

@Devolus я бы догадался, но «счастливо открыт». –

+0

Удивительно, наверное, я должен был проверить страницу руководства. Еще один вопрос, похоже, что если я проверю возвращаемое значение, тогда, когда я перенаправляю stdin, и выход идет в файл, я получаю 'Нет такого устройства или адреса'. Вы знаете, что может быть причиной? – user1024718