C 重新分配stdout会为一个字符和多个字符提供不同的行为

C 重新分配stdout会为一个字符和多个字符提供不同的行为,c,C,我刚刚注意到一个非常简单的C程序中有一个奇怪的行为 #include <stdio.h> int main() { stdout = fopen("out.txt", "w"); printf("X"); /* This prints X to the terminal */ printf("YZ"); /* This writes YZ to the file out.txt */ return 0; } #包括 int main() { stdo

我刚刚注意到一个非常简单的C程序中有一个奇怪的行为

#include <stdio.h>
int main()
{
    stdout = fopen("out.txt", "w");
    printf("X"); /* This prints X to the terminal */
    printf("YZ"); /* This writes YZ to the file out.txt */
    return 0;
}
#包括
int main()
{
stdout=fopen(“out.txt”,“w”);
printf(“X”);/*将X打印到终端*/
printf(“YZ”);/*将YZ写入out.txt文件*/
返回0;
}
为什么打印一个字符串会将其输出到终端/控制台,而打印两个字符串会写入标准输出(在本例中为out.txt)


我在Ubuntu 16.04上使用的是GCC 5.4版。

按照C89规范,您不能分配
stdout

116freopen函数的主要用途是更改与标准文本流(stderr、stdin或stdout)关联的文件,因为这些标识符不需要是可修改的左值,fopen函数返回的值可以分配给这些左值。
因此,您应该使用
freopen()
。您可以放弃分配(如标准中所述,您不能分配标准文本流),只需执行
freopen(“out.txt”,“w”,stdout)

按照C89规范,您不能分配
stdout

116freopen函数的主要用途是更改与标准文本流(stderr、stdin或stdout)关联的文件,因为这些标识符不需要是可修改的左值,fopen函数返回的值可以分配给这些左值。
因此,您应该使用
freopen()
。您可以放弃分配(如标准中所述,您不能分配标准文本流),只需执行
freopen(“out.txt”,“w”,stdout)

我尝试了代码,遇到了相同的问题,如果您将first print更改为printf(“XY”),则与我尝试了代码并遇到了相同的问题一样,如果您将first print更改为printf(“XY”),则效果良好它工作得很好,我将添加编译器通过
putchar
优化调用,并且它可能使用文件描述符
1
而不是
stdout
。这就是为什么一两个角色的行为有所不同。谢谢,@Stargateur,这对我来说很好。我可能应该尝试使用gdb或strace,并且更加努力地寻找。再次感谢。我要补充的是,编译器通过
putchar
优化调用,它可能使用文件描述符
1
而不是
stdout
。这就是为什么一两个角色的行为有所不同。谢谢,@Stargateur,这对我来说很好。我可能应该尝试使用gdb或strace,并且更加努力地寻找。再次感谢。