为什么 c 中的 printf 似乎在其他操作发生后给出结果?

why does printf in c seems to gives its result after other action occured?

我确定我的困难,但不知道它的原因,所以我的标题可能不是这个问题的好问题:/

我正在创建一个用作 printf 的函数,我们称它为 print2,为了测试它,我编写了这段包含标准输出和宏重定向的小代码,因为我想要在标准输出上查看真实 printf 的操作,我的 print2 的操作,并将这些结果存储在两个文件 out1 和 out2 中(以便之后比较它们)。它工作正常(见下文),但由于其他原因我需要更改宏中的操作顺序,这里出现了问题。

什么有效:

#include "printf2.h"
#include <stdio.h> // for printf
#include <fcntl.h> // for dup() and dup2() and open() and close()

#define PRINT(string) \
        printf("printf:" string "\n"); \
        print2("print2:" string "\n\n"); \
        dup2(out1, 1); \
        printf("printf:" string "\n"); \
        dup2(out2, 1); \
        print2("print2:" string "\n"); \
        dup2(save, 1);

int     main(void)
{
    int out1 = open("out1.txt", O_WRONLY | O_TRUNC);
    int out2 = open("out2.txt", O_WRONLY | O_TRUNC);
    int save = dup(1);

    PRINT("test1");
    PRINT("test2");

    close(out1);
    close(out2);
    close(save);
    return (0);
}

在控制台上给我这个输出:

printf:test1
print2:test1

printf:test2
print2:test2

和out1.txt:

printf:test1
printf:test2

和out2.txt:

print2:test1
print2:test2

完美,我可以在控制台上直观地比较,并在文件中写一个函数进行比较。

什么不起作用:

但正如我所说,我的代码当然要复杂得多,出于外部原因,我需要按另一个顺序执行此操作,这个(首先写入文件,然后在控制台上):

#define PRINT(string) \
        dup2(out1, 1); \
        printf("printf:" string "\n"); \
        dup2(out2, 1); \
        print2("print2:" string "\n"); \
        dup2(save, 1); \
        printf("printf:" string "\n"); \
        print2("print2:" string "\n\n");

它让我搞砸了,在控制台上我得到了这个:

print2:test1

print2:test2

printf:test1
printf:test1
printf:test2
printf:test2

在文件 out1.txt 中:

[empty]

在文件 out2.txt 中:

print2:test1
print2:test2

我试图用 'print2()' 或 'write()' 替换所有 'printf()' 实例并且它有效,所以在我看来 printf 在控制台上打印花费的时间太长并且输出文件描述符已经被更改...我说得对吗?有解决办法吗?在继续程序之前等待 printf 结束的方法可能吗?

stdout 的输出由系统缓冲。 fflush 调用将强制写入所有缓冲的输出。在对流进行更改之前,fflush(stdout) 完成所有打印。