- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
试图implement freopen() ,据我所知,我在标准中找到了一条实际上没有指定任何内容的规范。
所以... freopen()
将关闭流(忽略错误),清除其错误和 EOF 标志,重置宽方向,然后以给定的模式重新打开流。这很清楚;这基本上是一个 fclose()/fopen()。即使它不是那样定义的,很明显这就是它的意图。
但是,我有两个关于事情的问题setvbuf()
可以对流进行处理——设置用户分配的缓冲区,和/或更改缓冲区策略。
问题 1。
1) 是 freopen()
期望将事情恢复到默认状态,就好像它实际上已经调用了 fopen()
?或者无论用户通过 setvbuf()
设置什么,它都有望转移到新的流中。就旧?这涉及缓冲存储器和缓冲策略,但这里的主要问题是缓冲存储器。fclose()
的规范指定用户通过 setvbuf()
与流关联的任何缓冲区已解除关联,即现在可以是 free()
由用户。
但是freopen()
仅指定它关闭与流关联的文件,而不是它 fclose()
是的。
所以,在 freopen()
之后, 用户关联的缓冲内存是否仍然与流关联?
问题 2。freopen()
可以想象,可以在 FILE
上使用在调用时实际上并未与打开的文件关联的结构(因为尝试关闭文件的错误将被忽略)。
该文件结构可能是先前打开的流,具有用户分配的缓冲内存和缓冲策略。是 freopen()
遵守这些设置,即将缓冲存储器/策略与“重新”打开的文件重新关联,或者是否将结构重新初始化为默认值,假设用户 free()
d fclose()
之后的缓冲存储器之前的文件?
我的。
看看第二季度,我没有看到标准库可以可靠地确定当前未打开的 FILE
的方法。具有用户分配的缓冲内存的结构仍然“拥有”该缓冲内存,或者用户是否已经回收了该内存。 (可以想象,该内存可能是本地的,即不属于 malloc()
/free()
处理的内存列表的一部分,即使我愿意去那里——这将非常不寻常地涉及标准库函数所期望的工作。)
缓冲政策的类似考虑。
因此,据我所知,唯一可靠的处理方式是 freopen()
将“与指定流关联的任何文件”的关闭处理为“真实”fclose()
,并将缓冲存储器/策略重新设置为默认值。
我的这种理解是对的,还是 Q1/Q2 有其他答案?
最佳答案
C 标准没有声明以任何方式修改缓冲状态。
整个C11 freopen()
specification是(包括 footnote 272 ):
7.21.5.4 The
freopen
functionSynopsis
1
#include <stdio.h>
FILE *freopen(const char * restrict filename,
const char * restrict mode,
FILE * restrict stream);Description
2 The
freopen
function opens the file whose name is the string pointed to byfilename
and associates the stream pointed to by stream with it. Themode
argument is used just as in thefopen
function.272)3 If
filename
is a null pointer, thefreopen
function attempts to change the mode of the stream to that specified bymode
, as if the name of the file currently associated with the stream had been used. It is implementation-defined which changes of mode are permitted (if any), and under what circumstances.4 The
freopen
function first attempts to close any file that is associated with the specified stream. Failure to close the file is ignored. The error and end-of-file indicators for the stream are cleared.Returns
5 The
freopen
function returns a null pointer if the open operation fails. Otherwise,freopen
returns the value ofstream
.
272) The primary use of the
freopen
function is to change the file associated with a standard text stream (stderr
,stdin
, orstdout
), as those identifiers need not be modifiable lvalues to which the value returned by thefopen
function may be assigned.
stream
指向的预先存在的流有一个与之关联的新文件 - 仅此而已。通过不指定对缓冲的任何更改,这对我来说意味着保留当前的缓冲区状态,如
freopen()
只是将新文件和模式与
相关联已有 溪流。只有对
FILE *
的那些更改通过我的阅读,应该制定标准中明确指出的流。
freopen
函数首先尝试关闭与指定流关联的任何文件。同样,标准是指指定的流。
freopen()
不创建新流。它只是将预先存在的流指向一个新文件——这就是它所做的一切。
freopen()
implementation也不是
the OpenSolaris/Illumos implementation (很可能是当前的 Solaris 实现)似乎修改了原始缓冲的状态,而不是在关闭文件之前刷新任何缓冲区。
freopen()
功能似乎没有详细说明。
POSIX has this to say :
APPLICATION USAGE
The
freopen()
function is typically used to attach the pre-opened streams associated withstdin
,stdout
, andstderr
to other files.Since implementations are not required to support any stream mode changes when the
pathname
argument isNULL
, portable applications cannot rely on the use offreopen()
to change the stream mode, and use of this feature is discouraged. The feature was originally added to the ISO C standard in order to facilitate changingstdin
andstdout
to binary mode. Since a'b'
character in the mode has no effect on POSIX systems, this use of the feature is unnecessary in POSIX applications. However, even though the'b'
is ignored, a successful call tofreopen (NULL, "wb", stdout)
does have an effect. In particular, for regular files it truncates the file and sets the file-position indicator for the stream to the start of the file. It is possible that these side-effects are an unintended consequence of the way the feature is specified in the ISO/IEC 9899:1999 standard, but unless or until the ISO C standard is changed, applications which successfully callfreopen (NULL, "wb", stdout)
will behave in unexpected ways on conforming systems in situations such as:{ appl file1; appl file2; } > file3
which will result in file3 containing only the output from the second invocation of appl.
关于c - freopen() 在缓冲方面的预期行为 (setvbuf())?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60113158/
我对构面有疑问,并根据构面进行了一些过滤。 我知道这是一个重复的问题,但我找不到答案。 我想知道如何在 flex 搜索中实现相同的功能。 假设我有一个有关汽车和某些方面的索引-例如模型和 颜色。 颜色
我正在尝试找到一种解决方案来为某些方面创建子方面列表。 我有一些产品的衣服尺码,它们存储在 solr 中 "Size_both":"W30L30","尺寸宽度":"W30","Size_length"
我正在尝试找到一种解决方案来为某些方面创建子方面列表。 我有一些产品的衣服尺码,它们存储在 solr 中 "Size_both":"W30L30","尺寸宽度":"W30","Size_length"
我对方面有疑问。他们不开火。我有小方面: @Aspect @Component public class SynchronizingAspect { @Pointcut("execution(
这是在 ruby 中启用散列自动生成的巧妙技巧(取自 facets): # File lib/core/facets/hash/autonew.rb, line 19 def self.a
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: Creating a facet_wrap plot with ggplot2 with different ann
XMLHttpRequest 能否从 http://mydomain.example/ 向 http://mydomain.example:81/ 发送请求? 最佳答案 要使两个文档被视为具有相同的来
我对 Elasticsearch 中的方面有一点问题。 我有一个表格视频,一个表格 channel ,一个 channel 有很多视频。 我只想在 X 个最新视频上显示每个 channel 的 %vi
假设我正在为 4 个人绘制数据图表:Alice、Bob、Chuck 和 Dana。我正在使用 ggplot2 制作一个多面图,每个人一个方面。我的磁盘上还有 4 张图像:Alice.png、Bob.p
我已经下载了收件箱,并且正在使用Pig和Hadoop处理电子邮件。我已经使用Pig和Wonderdog在ElasticSearch中为这些电子邮件编制了索引。 现在,我为收件箱中的每个电子邮件地址创建
我有一个模块如下: define([...], function(...){ function anothermethod() {...} function request() {....}
(defprotocol IAnimal "IAnimal" (report [o] (println (type o) " reporting.\n") (inner-repor
我有一个 Bean 需要向 InfluxDB 报告。数据库在表 INFLUX_DB_SERVER 中注册了 InfluxDB。如果你看一下代码,你会发现方法reportMemory做了很多工作,它构造
我的问题与分面有关。在下面的示例代码中,我查看了一些分面散点图,然后尝试在每个分面的基础上叠加信息(在本例中为平均线)。 tl;dr 版本是我的尝试失败了。要么我添加的平均线计算所有数据(不尊重方面变
假设我正在为 4 个人绘制数据图表:Alice、Bob、Chuck 和 Dana。我正在使用 ggplot2 制作一个多面图,每个人一个方面。我的磁盘上还有 4 张图像:Alice.png、Bob.p
尝试用两个方面包装服务类来获取此调用链: javanica..HystrixCommandAspect -> MyCustomAroundAspect -> MyService 遇到两个问题: Hys
我是 AspectJ 的初学者。我用它在我的网络驱动程序中截取屏幕截图。以下是我的包结构。 我想知道如何在 Browser 类中运行我的程序,以便它使用 Screenshots 类中定义的 Aspec
我在使用 spring aop 时遇到问题 (编辑:如果我的方法不是静态的,则代码可以正常工作) 我的包中有这个结构: aaa.bbb.ccc.Clase1.java aaa.bbb.ddd.Clas
我有一个通用存储库类,其中包含各种标记有 PostSharp 方面 (SecuredOperation) 的方法... public class Repository : IRepository, I
我有一个运行多线程的 Hibernate 事务方法“doImportImpl”。而某些记录需要依次导入,所以代码结构大致是这样的: public RecordResult doImportImpl(S
我是一名优秀的程序员,十分优秀!