【问题标题】:why does printf in c seems to gives its result after other action occured?为什么 c 中的 printf 在发生其他操作后似乎给出了结果?
【发布时间】: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) 完成所有打印
  • 非常感谢,如果您提供答案而不是评论,我可以将您标记为解决方案:)

标签: c printf dup2 dup


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 2022-08-13
    • 2017-09-21
    • 1970-01-01
    • 2019-08-04
    • 2017-01-11
    • 1970-01-01
    • 2018-12-12
    • 2015-08-25
    相关资源
    最近更新 更多