3

考虑以下代码:

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

4

1 回答 1

3

来自函数的C++标准freopen

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

模式

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

...

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

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

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

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

此函数对于将预定义的流(如stdin、 stdout 和 stderr )重定向到特定文件特别有用。

这是对它合法使用w+的又一确认stdin

于 2020-02-09T09:50:03.897 回答