2014-02-08 2 views
0

errno_t freopen_s (FILE ** pFile, const char * path, const char * mode, FILE * stream);freopen или freopen_s, что именно они делают?

Здесь freopen_s разъединяет указатель FILE stream от того, что он указывает на, затем связывает его с файлом, который находится в path. mode определяет пределы для того, что можно сделать с помощью этого конкретного указателя stream.

Насколько я могу судить, все это не что иное, отличается от того, что случилось бы с:

... 
fclose(stream); 
fopen_s(&stream, path, mode); 
... 

Мой вопрос: Что делает pFile там делать? freopen также имеет его, как возвращаемое значение. Из всех примеров, которые я видел, pFile, после вызова, также указывает на тот же файл, который находится по адресу path. Таким образом:

... 
fclose(stream); 
fopen_s(&stream, path, mode); 
fopen_s(pFile, path, mode); 
... 

Действительно ли это так?

+0

freopen() делает это атомарно, довольно важно, когда у вас есть потоки, которые также записываются в один поток. –

+0

Я так понимаю, и предпочел бы, чтобы в любой день. Тем не менее, я не понимаю, почему он присваивает один * путь к файлу * 2 * указателям FILE * ... Я не вижу никакой пользы от этого. И в любом другом примере, который я видел, назначение 'FILE * pFile', или возвращаемое значение остается неиспользованным. – ThoAppelsin

+0

Я предполагаю, что вы говорите об защищенной версии, freopen_s(). Он гарантирует, что ваш ФАЙЛ * будет NULL, когда вы сделаете это неправильно. Слишком много программистов на C игнорируют возвращаемое значение, как вы хотите, слепо надеясь, что он сработает, а затем продолжайте писать в несуществующий файл. Который превращает вашу программу в зомби, который является желающим участником перехвата ручки. –

ответ

1

Когда вы продолжите читать помощь, которая ссылается на ваш вопрос вы найдете ответ:

`freopen_s` is typically used to redirect the pre-opened files stdin, stdout, 
and stderr to files specified by the user. 

Так что не предполагается, что вы используете самостоятельно определить указатель файла freopen. Вместо этого он влияет на, вероятно, широко распространенный использованный stdout и т. Д.

Что касается вашего вопроса «Это действительно так?»: Да.

Edit: Что касается другого вопроса: Мой вопрос: Что делает Pfile там делать?

Параметр pFile для функции freopen_s является указателем на FILE*. Функция может выделять новый объект FILE и возвращать новый указатель с pFile. Могут быть библиотеки времени выполнения, которые не выделяют новый объект, но изменяют структуру FILE, которая косвенно передается *pFile. Но это сильно зависит от реализации.

Далее неатомная операция может завершиться неудачно после части fclose. В этом случае время выполнения может изменить указатель, который передается с pFile в NULL.

+0

Но почему существует аргумент 'FILE ** pFile' для' freopen_s', и почему же существует «FILE *» возвращаемое значение для «freopen»? 'freopen_s (что-то, путь, режим, stdout);' перенаправляет 'stdout' на' path', без этого 'что-либо ', что-то действительно важно вообще ... А что касается' freopen', возвращаемое значение не обслуживает кроме указания ошибки при возникновении ошибки; но почему массивный тип структуры 'FILE *' возвращается для чего-то подобного, вместо 'errno_t' (int) или даже любого' char'? – ThoAppelsin

+0

Возвращаемое значение таких функций, как 'freopen_s' и' strcpy', может быть хорошей темой для следующего вопроса, но, вероятно, вы можете его искать. Если вы считаете, что получили ответ, вы можете нажать на «принятую» галочку. – harper

+0

Простите, если бы у меня был, но единственный ответ, который я получил по моему реальному вопросу (указанному в «My question is: ...»), заключается в том, что «pFile» указывает на отказ », что не было это единственный ответ. И, честно говоря, я уже знал, что так или иначе ... Я скорее ожидал, что мой вопрос будет интерпретироваться как «Почему существуют два значения, предназначенные для индикации ошибок, одна из которых требует, чтобы вы указали указатель на указатель FILE?» , Но, черт возьми, поскольку, по-видимому, нет никакого законного ответа на это, я бы принял «это за указание отказа», но этот ответ не делает этого – ThoAppelsin