setbuf (), setvbuf () или fflush (), - и trap SIGINT
или все, что подходит для вашей системы.
То есть
#include <stdio.h>
#include <unistd.h> /* for sleep() in this example */
int main(void)
{
FILE *fh;
char *fn = "main.log";
int i;
if ((fh = fopen(fn, "w")) == NULL) {
fprintf(stderr,
"Unable to open file %s\n", fn);
return 1;
}
setbuf(fh, NULL); /* Turns buffering completely off */
for (i = 1; ; ++i) {
fprintf(fh, "%d ok ", i);
if (!(i%120))
fprintf(fh, "\n");
sleep(1);
}
fclose(fh);
return 0;
}
в другой консоли:
$ tail -f main.logВыход: 1 хорошо 2 хорошо 3 хорошо 4 хорошо 5 хорошо 6 хорошо ^ C
или fflush(fh)
, когда вы хотите очистить буфер записи.
stdio.h :>
int setvbuf(FILE* stream, char* buf, int mode, size_t size);
Управляет буферизацией для потокового потока.режим _IOFBF для полной буферизации, _IOLBF для строковой буферизации, _IONBF для без буферизации.Non-null buf указывает буфер размера, который будет использоваться;в противном случае буфер выделяется.Возвращает ненулевое значение при ошибке. Вызов должен быть перед любой другой операцией в потоке .
void setbuf(FILE* stream, char* buf);
Управляет буферизацией для потокового потока.Для null buf отключает буферизацию, иначе эквивалентно (void) setvbuf (stream, buf, _IOFBF, BUFSIZ).
int fflush(FILE* stream);
Сбрасывает поток потока и возвращает ноль в случае успеха или EOF в случае ошибки.Эффект не определен для входного потока.fflush (NULL) сбрасывает все выходные потоки.