为什么 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)
完成所有打印。
我确定我的困难,但不知道它的原因,所以我的标题可能不是这个问题的好问题:/
我正在创建一个用作 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)
完成所有打印。