请考虑以下代码:
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++ standard开始用于freopen
功能:
FILE * freopen(const char *文件名,const char *模式,FILE *流);
模式
C包含文件访问模式的字符串。可以是:
...
w +-写入/更新:创建一个空文件并打开以进行更新(两者用于输入和输出)。如果同名文件已经存在内容将被丢弃,该文件将被视为新的空文件。
因此,按照标准,这完全是合法的。
但是,如果您想更确定一点,请检查返回值是否为空指针。甚至更多,如果失败,请检查errno
变量是否设置为系统特定的错误代码。
此外,如果您仔细查看freopen
文档,您将看到以下句子:
此功能对于重定向预定义的流特别有用如stdin,stdout和stderr到特定文件。
这是另一个确认,w+
用于stdin
是合法的。