如何清除文件的内容

时间:2010-06-29 01:40:04

标签: c unix

我想知道如何在C中清除文件的内容。我知道可以使用truncate来完成,但我找不到任何清楚描述如何的来源。

5 个答案:

答案 0 :(得分:12)

其他答案解释了如何正确使用truncate ...但是如果你发现自己身处一个没有unistd.h的非POSIX系统,那么最简单的事情就是打开写文件并立即关闭:

#include <stdio.h>

int main()
{
    FILE *file = fopen("asdf.txt", "w");
    if (!file)
    {
        perror("Could not open file");
    }

    fclose(file);
    return 0;
}

使用"w"打开文件(对于写入模式)“清空”文件,以便您可以开始覆盖它;立即关闭它然后产生一个0长度的文件。

答案 1 :(得分:5)

UNIX中的truncate()调用只是:

truncate("/some/path/file", 0);

答案 2 :(得分:4)

虽然您可以只打开和关闭该文件,但truncate调用是专为此用例设计的:

#include <unistd.h> //for truncate
#include <stdio.h>  //for perror

int main()
{
    if (truncate("/home/fmark/file.txt", 0) == -1){
      perror("Could not truncate")
    }
    return 0;
}

如果您已经打开了该文件,则可以将该句柄与ftruncate一起使用:

#include <stdio.h>  //for fopen, perror
#include <unistd.h> //for ftruncate

int main()
{
    FILE *file = fopen("asdf.txt", "r+");
    if (file == NULL) {
        perror("could not open file");
    }

    //do something with the contents of file

    if (ftruncate(file, 0) == -1){
          perror("Could not truncate")
    }

    fclose(file);
    return 0;
}

答案 3 :(得分:1)

为了删除fie的内容,显然有一种基本的方法是以写入模式“w”打开文件,然后关闭它而不对其进行任何更改。

FILE *fp = fopen (file_path, "w");

fclose(fp);

这将删除文件中的所有数据,因为当您使用“w”模式打开已存在的文件时,文件将被删除并且打开一个具有相同名称的新文件进行写入,这将导致删除您的内容文件。

但在UNIX系统中存在truncate syscall,它专门用于同一目的并且非常易于使用:

truncate (filepath, 0);

如果您已经打开了文件,那么要么在执行截断之前关闭文件,要么使用ftruncate

ftruncate (file_path, 0);

答案 4 :(得分:1)

truncate(2)不是便携式呼叫。它只符合4.2BSD。虽然它可以在大多数* nix类型系统上找到,但我会说使用符合POSIX.1的例程,这些例程在大多数现代环境(包括Windows)中都得到了很好的保证。

所以这是符合POSIX.1-2000的代码片段:

int truncate_file(const char *name) {
    int fd;
    fd = open (name, O_TRUNC|O_WRONLY);
    if ( fd >= 0 ) 
        close(fd); /* open can return 0 as a valid descriptor */
    return fd;
}