【发布时间】:2020-02-25 19:41:49
【问题描述】:
我确定我的困难,但不确定原因,所以我的标题可能不是解决这个问题的好问题:/
我正在创建一个用作 printf 的函数,我们称它为 print2,为了测试它,我编写了这个包含 stdout 和宏重定向的小代码,因为我想在标准输出真正的 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 结束的方法可能吗?
【问题讨论】:
-
输出由系统缓冲。在进行更改之前使用 fflush(stdout) 完成所有打印
-
非常感谢,如果您提供答案而不是评论,我可以将您标记为解决方案:)