为了实现 freopen(),我在标准中提出了一条规范,据我所知,该规范实际上并没有指定任何内容。
所以...freopen()
将关闭流(忽略错误),清除其错误和 EOF 标志,重置宽方向,然后以给定模式重新打开流。这很清楚;这基本上是一个 fclose() / fopen()。即使没有这样定义,很明显这就是预期的。
setvbuf()
但是,关于可能对流所做的事情,我有两个问题- 设置用户分配的缓冲区和/或更改缓冲区策略。
问题 1。
1)freopen()
预计将事物恢复到默认状态,就好像它实际调用过一样fopen()
?或者,无论用户在旧流上设置了什么,它是否有望延续到新流setvbuf()
?这指的是缓冲存储器和缓冲策略,但这里的主要问题是缓冲存储器。
的规范fclose()
指定用户与流相关联的任何缓冲区setvbuf()
都是解除关联的,即现在可以free()
由用户'd'。
但freopen()
只指定它关闭与流关联的文件,而不是fclose()
它。
那么,在 之后freopen()
,用户关联的缓冲内存是否仍然与流关联?
问题2。
freopen()
可以想象,可以FILE
在调用时实际上与打开文件无关的结构上使用(因为尝试关闭文件的错误将被忽略)。
该文件结构可能是以前打开的流,具有用户分配的缓冲区内存和缓冲区策略。是freopen()
遵守这些设置,即将缓冲存储器/策略与“重新”打开的文件重新关联,还是将结构重新初始化为默认值,假设用户在之前 ing 文件free()
后使用缓冲存储器?fclose()
我的看法。
看看 Q2,我看不到标准库有一种方法可以可靠地确定FILE
具有用户分配的缓冲内存的当前未打开的结构是否仍然“拥有”该缓冲内存,或者用户是否已经回收了该内存。(可以想象,该内存可能是本地的,即不是由malloc()
/处理的内存列表的一部分,free()
即使我愿意去那里——这将是标准库函数所期望的非常反常的工作。)
缓冲政策的类似考虑。
因此,据我所知,唯一可靠freopen()
的处理方式是将“与指定流关联的任何文件”的关闭处理为“真实” fclose()
,并将缓冲内存/策略重新设置为默认值。
我的理解是否正确,还是 Q1 / Q2 有其他答案?