- 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/
我对java有点陌生,所以如果我犯了一个简单的错误,请原谅我,但我不确定我哪里出错了,我收到的错误是“预期的.class,预期的标识符,而不是声明, ';'预期的。”我尝试了不同的方法,并从这些方法中
This question already has answers here: chai test array equality doesn't work as expected (3个答案) 3年前
我正在学习 Java(对不起,我的英语很差,这不是我的母语),当我在 Eclipse (JavaSE-1.7) 中在我输入的每个“try”中执行“try-finally” block 时,会出现以下消
我收到两个错误,指出 token 上的语法错误,ConstructorHeaderName expected instead & token “(”上的语法错误,< expected 在线: mTM.
我找不到错误。 Eclipse 给我这个错误。每个 { } 都是匹配的。请帮忙。 Multiple markers at this line - Syntax error on token “)”,
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DoubleIt extends
我正在用 python(Vs 代码)编写代码,但出现此错误: Expected ")" Pylance 错误发生在:def main() 我试着运行我的 main 并将它打印到我的屏幕上。我用谷歌搜
我正在尝试按照 documentation 中的建议使用异步函数。但我收到此错误 意外的 token ,预期 ( async function getMoviesFromApi() { try
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
第一行包含一个表示数组长度的整数p。第二行包含用空格分隔的整数,这些整数描述数组中的每个元素。第三行打印一个整数,指示负数组的数量。 package asgn3; import java.util.*
好的,我是初学者,我必须修复此 java 表达式语言代码才能在我的系统 (Windchill) 中工作,但看起来我在语法中遗漏了一些内容: LWCNormalizedObject lwc =
我无法编译我的程序! 我想我缺少一个花括号,但我怎么也看不出在哪里! import javax.swing.*; import java.awt.*;
我的 jQuery 代码有问题,我的 Firebug 向我发出警告:需要选择器。 这是代码: $("img[id$='_tick']").each(function() { $(this).c
我的新类(class) Fountainofyouth 遇到了问题。尝试构建整个项目后,调试器显示 warning: extended initializer lists only available
我已经从 Java 转向 CPP,并且正在努力围绕构造构造函数链进行思考,我认为这是我的问题的根源。 我的头文件如下: public: GuidedTour(); GuidedTour(string
鉴于以下 for(var i=0; i< data.cats.length; i++) list += buildCategories(data.cats[i]); jsLint 告诉我 Expect
我有这个 json,但 Visual Studio Code 在标题中给了我警告。 [ { "title": "Book A", "imageUrl": "https:
我正在尝试编写一个有条件地禁用四个特殊成员函数(复制构造、移动构造、复制赋值和移动赋值)的包装类,下面是我用于测试目的的快速草稿: enum class special_member : uint8_
所以我用 F# 编写了一个非常简单的程序,它应该对 1000 以下的所有 3 和 5 的倍数求和: [1..999] |> List.filter (fun x -> x % 3 = 0 || x %
我是一名优秀的程序员,十分优秀!