考虑以下代码:
freopen("buffer.txt", "w+", stdin);
fprintf(stdin, "hello");
fseek(stdin, 0, SEEK_SET);
char str[16];
scanf("%s", str);
printf("%s", str);
我发现标准中没有条目限制我这样做,但是也没有条目明确允许这样做。我应该期望该代码在任何符合标准的编译器上都能工作吗?如果stdin
(或stdout
)在读写模式下打开,任何标准的I / O功能会中断还是导致UB ?那么c ++流呢?
来自C ++标准的freopen
函数:
FILE * freopen(const char *文件名,const char *模式,FILE * stream);
模式
包含文件访问模式的C字符串。有可能:
...
w +-写入/更新:创建一个空文件并打开以进行更新(用于输入和输出)。如果已经存在同名文件,则将其内容丢弃,并将该文件视为新的空文件。
因此,按照标准,这是完全合法的。
但是,如果要更加确定,请检查返回值是否为空指针。甚至更多,请检查是否将errno
变量设置为失败时系统特定的错误代码。
此外,如果您仔细查看freopen
文档,将会看到以下句子:
此功能对于将预定义流(例如stdin,stdout和stderr)重定向到特定文件特别有用。
这是一个更确认它是合法使用w+
的stdin
。
关于“ 这是另一个确认,将w +用作stdin是合法的。 ”,不,它只表示您可以重定向stdin。对于是否可以更改其模式,它保持沉默。
@ikegami:除非对更改模式有特殊限制,否则更改模式的一般津贴与标准流使用的津贴相结合就意味着它是允许的。