是否允许在标准输入中以“ w +”模式使用freopen?

问题描述 投票:3回答:1

请考虑以下代码:

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++ c stream stdin freopen
1个回答
3
投票

C++ standard开始用于freopen功能:

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

模式

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

...

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

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

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

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

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

这是另一个确认,w+用于stdin是合法的。

© www.soinside.com 2019 - 2024. All rights reserved.