почему printf в c, похоже, дает свой результат после того, как произошло другое действие? - PullRequest
0 голосов
/ 25 февраля 2020

Я уверен в своей сложности, но не в ее причине, поэтому мой заголовок может быть не очень хорошим вопросом для этой проблемы: /

Я создаю функцию, которая работает как 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

Я попытался заменить все экземпляры printf () на print2 () или write (), и это сработало, поэтому мне кажется, что printf просто слишком долго печатается на консоли и т. дескриптор выходного файла уже был изменен ... Я прав? и есть ли решение? Можно ли ждать завершения printf, прежде чем продолжить программу?

1 Ответ

1 голос
/ 26 февраля 2020

Вывод на стандартный вывод буферизируется системой. Вызов fflu sh заставит записать весь буферный вывод. Выполните fflush(stdout), чтобы завершить всю печать, прежде чем вносить изменения в потоки.

...