fopen fprintf не записывать в файл только после его закрытия - PullRequest
3 голосов
/ 24 декабря 2011

как разрешить запись в файл перед его закрытием, у меня есть этот код для записи в файл, он делает это, но только после того, как я закрываю приложение, и оно получает отвлекающий его часть простой регистратор. мне нужно увидеть обновления записи (с tail -f)

void init(char *pfileName)
    {
        if(pfileName != NULL)
        {
            fp = fopen(pfileName, "a+");
            if(fp != NULL)
                fseek(fp, 0, SEEK_END);
        }
    }

    void close()
    {
        if(fp != NULL)
            fclose(fp);
        fp = NULL;
    }

void write(char *pType, std::string pMsg, char *pFileName, int lineNo)
    {
        if(fp != NULL)
        {
            fprintf(fp,"%s %s %s %s %d %s\n", pType, __DATE__, __TIME__, pFileName, lineNo, pMsg.c_str());

        }
    }

Ответы [ 2 ]

8 голосов
/ 24 декабря 2011

IO, вероятно, буферизован.Вставьте fflush(fp) после записи.

5 голосов
/ 24 декабря 2011

Амадан правильный , fflush(fp) решит проблему за вас.

Но если вы хотите решить эту проблему везде, вам вместо этого следует использовать функцию setvbuf(3), чтобы поставитьваш конкретный FILE указатель в линейный режим.Стандартные потоки ввода-вывода C поддерживают без буферизации , буферизация строк , буферизация блоков .По умолчанию все файлы имеют блочную буферизацию;стандартный вывод буферизуется при отправке на терминал, а стандартная ошибка не буферизируется.Вы можете изменить эти значения по умолчанию.

Добавьте setlinebuf(fp); в свое приложение сразу после проверки на наличие ошибок для fp = fopen(...);, и весь ваш вывод в этот поток FILE будет буферизован строкой.Это, конечно, приносит с собой потери производительности буферизации строк, а не блочной буферизации, но люди обычно жалуются на это, когда их вывод в любом случае довольно медленный.(В противном случае блоки будут быстро заполняться и быстро стираться.)

...