Как я могу открыть файловый поток и очистить его без имени файла?

Допустим, у меня есть поток файлов.

FILE *fp = fopen("hi.txt", "w");
fprintf(fp, "test");

Я хочу как-то открыть его снова, но я также хочу очистить его, и у меня нет доступа к имени файла на этот раз. Я пытался сделать следующее, но это не меняет вывод.

fp = freopen(NULL, "w", fp);
fprintf(fp, "changed");
fflush(fp);

Это все еще говорит "тест" в выходном файле.

1 ответ

Попробуйте следующее. Основная идея состоит в том, чтобы получить дескриптор файла из потока, но вам все равно нужно закрыть поток, поэтому я дублирую дескриптор файла, аккуратно закрываю поток, а затем вызываю ftruncate для дубликата дескриптора файла, минуя поток.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    FILE   *fp;
    int     fd;
    int     fd2;

    fp = fopen("junk.txt", "w");
    fprintf(fp, "foo\n");
    fd = fileno(fp);
    fd2 = dup(fd);
    fclose(fp);
    ftruncate(fd2, 0);
    close(fd2);
    return 0;
}
Другие вопросы по тегам