温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - Is it allowed to use freopen with "w+" mode for stdin?
c c++ stdin stream freopen

c++ - 是否可以将带有“ w +”模式的freopen用于stdin?

发布于 2020-04-26 11:12:27

考虑以下代码:

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 ++流呢?

查看更多

提问者
Denis Sheremet
被浏览
91
NutCracker 2020-02-09 17:55

来自C ++标准freopen函数:

FILE * freopen(const char *文件名,const char *模式,FILE * stream);

模式

包含文件访问模式的C字符串。有可能:

...

w +-写入/更新:创建一个空文件并打开以进行更新(用于输入和输出)。如果已经存在同名文件,则将其内容丢弃,并将该文件视为新的空文件。

因此,按照标准,这是完全合法的。

但是,如果要更加确定,请检查返回值是否为空指针。甚至更多,请检查是否将errno变量设置为失败时系统特定的错误代码。

此外,如果您仔细查看freopen文档,将会看到以下句子:

此功能对于将预定义流(例如stdin,stdout和stderr)重定向到特定文件特别有用

这是一个更确认它是合法使用w+stdin