C++ 是否允许将freopen与“一起使用?”;w+&引用;stdin的模式?

C++ 是否允许将freopen与“一起使用?”;w+&引用;stdin的模式?,c++,c,stream,stdin,freopen,C++,C,Stream,Stdin,Freopen,考虑以下代码: 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

考虑以下代码:

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++流如何?

< p>从<代码> FRUPENT</代码>函数:

文件*freopen(常量字符*文件名,常量字符*模式,文件*流)

模式

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

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

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

但是,如果您想更加确定,请检查返回值是否为null pointer。如果变量设置为故障时的系统特定错误代码,请检查
errno
变量

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

此函数对于重定向预定义流特别有用 与stdin、stdout和stderr一样,将stdin、stdout和stderr添加到特定文件


这是对
w+
用于
stdin

的合法性的又一次确认。。。看起来正常,但检查返回值:
if(!freopen(…)/*error*/为什么您会考虑打开一个输入流进行写入?它并没有在你的汽车加油口上写上不要加蜂蜜,但这并不意味着它是一个好的选择idea@MarkSetchell如果有人想从
stdin
获取“look”的输入,这可能是有意义的其中包含的内容,但更进一步,希望将此输入保留在
stdin
中,以便在
stdin
@roberts-supportsmonicacellio上进行进一步的操作。感谢您花时间解释。我现在想象某种“在不使用缓冲区的情况下偷看缓冲区”是可能的,但在打开输入进行写入的概念上仍然有困难。Re“这是对使用w+进行stdin合法性的又一次确认”。不,它所说的只是可以重定向stdin。它没有说明您是否可以更改其模式。@ikegami:除非它对更改其模式设置了特殊限制,否则更改模式的一般允许与标准流上使用的允许相结合意味着它是允许的。