freopen或freopen_s,他们究竟在做什么?

时间:2014-02-08 16:09:20

标签: c file-io freopen

  

errno_t freopen_s(FILE ** pFile,const char * path,const char * mode,FILE * stream);

这里,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 );
...

真的吗?

1 个答案:

答案 0 :(得分:1)

当您继续阅读问题中引用的帮助时,您会找到答案:

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

因此,不打算使用自定义的FILE指针freopen。相反,它会影响可能广泛使用的stdout等。

关于你的问题“这真的吗?”:是的。

修改:关于其他问题: 我的问题是:pFile在那里做什么?

函数freopen_s的pFile参数是指向FILE*的指针。该函数可以分配一个新的FILE对象,并返回带有pFile的新指针。可能存在不分配新对象但更改由*pFile间接传递的FILE结构的运行时库。但这是强烈依赖于实现的。

此外,fclose部分之后的非原子操作可能会失败。在这种情况下,运行时可能会将使用pFile传递的指针更改为NULL。