c - 如何重新打开文件流并在没有文件名的情况下清空它?

标签 c fopen freopen

假设我有一个文件流。

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

我想以某种方式再次打开它,但我也想清空它,但这次我无权访问文件名。我尝试执行以下操作,但它似乎并没有改变输出。

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

它仍然在输出文件中显示“test”。

最佳答案

尝试以下操作。基本思想是从流中获取文件描述符,但您仍然需要关闭流,所以我复制文件描述符,彻底关闭流,然后在复制的文件描述符上调用 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;
}

关于c - 如何重新打开文件流并在没有文件名的情况下清空它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33860588/

相关文章:

带有 switch/case 语句的 C 编译器指令?

c - 除了最后一个之外,所有 #pragma GCC 诊断均被忽略

c - 中断 tcpip 连接方法

c - stdout 上的 freopen_s 会导致 Windows 上的 GetConsoleScreenBufferInfo 出现问题

c - fopen 不能同时处理超过 60 个文件

php - 检查文件指针在 PHP 中是否仍然有效

c - 当我打开文件时会发生什么(RAM 和 ROM 很重要)

php - 如何使用 jquery 处理用于查看 xml 文件的 $GET 方法?

iPhone:将 NSLog 重定向到文件后,如何将其恢复到控制台?

c - 调试了4个小时,还是找不到BUG