Как я могу открыть файловый поток и очистить его без имени файла?
Допустим, у меня есть поток файлов.
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;
}