gpt4 book ai didi

c - 程序以奇怪的顺序执行

转载 作者:行者123 更新时间:2023-11-30 18:55:37 26 4
gpt4 key购买 nike

#include<stdio.h>
#define DEBUG
int main()
{
#ifdef DEBUG
freopen("ddd.txt","a",stdout);
freopen("ddd.txt","a",stderr);
#endif
printf("1\n");
perror("2");
printf("3\n");
perror("4");
printf("5\n");
perror("6");
}

正如 @JonathanLeffler 所说,在带有 GCC 4.9.1 的 Mac OS X 10.10.1 上,这给出了:

2: Undefined error: 0
4: Undefined error: 0
6: Undefined error: 0
1
3
5

为什么顺序很奇怪?

此外,perror 返回“无效参数”作为错误。在同一文件上使用 freopen 安全吗?

最佳答案

我在带有 GCC 4.9.1 的 Mac OS X 10.10.1 上得到的输出是:

2: Undefined error: 0
4: Undefined error: 0
6: Undefined error: 0
1
3
5

序列是这样的,因为标准错误没有被缓冲,标准输出被缓冲。

导致您收到错误 EINVAL,参数无效的原因可能有多种。除非 freopen() 返回错误指示,否则您没有理由检查 errno 中的值;即使库函数成功,也可以设置 errno。 (例如,在 Solaris 上,当输出到终端以外的其他设备时,许多输出操作会将 errno 设置为 ENOTTY,而不是 tty,即使操作成功。)

请注意,您应该严格检查 freopen() 的返回值在使用流之前不为 NULL。如果文件无法创建、不可写或者是目录等,则调用可能会失败。

并回答您的问题:

Is it safe to use freopen on the same file?

这取决于您对“安全”的定义。你的电脑会爆炸吗?不,不仅仅是因为这个。第二次尝试时 freopen() 会失败吗?不,事实并非如此。您能否通过数据获得有趣的交错效果?是的,当然了。标准输出 block 不一定以换行符结尾,可以很容易地与标准错误行交错。你会经常这样做吗?不,你不会经常这样做。如果这样做,您可能需要将标准输出和标准错误设置为使用 setvbuf() 进行行缓冲。紧接着调用 freopen() 后。这将减少看似奇怪的输出量。

关于c - 程序以奇怪的顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27287805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com