#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。如果无法创建文件,不可写文件或目录等,则调用可能会失败。

并解决您的问题:


  在同一文件上使用freopen是否安全?


这取决于您对“安全”的定义。您的计算机会崩溃吗?不,不仅仅是因为这个。第二次尝试会失败吗?不,不是。您能否获得有趣的数据交错效果?是的,当然了。标准输出的块(不一定以换行符结尾)很容易与标准错误的行交错。你会经常这样做吗?不,您不会经常这样做。如果这样做,您可能希望在调用freopen()之后立即将标准输出和标准错误都设置为使用setvbuf()缓冲的行。这将减少奇数输出的数量。

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

10-12 02:56