Как я могу очистить содержимое файла - PullRequest
4 голосов
/ 29 июня 2010

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

Ответы [ 5 ]

12 голосов
/ 29 июня 2010

Другие ответы объясняют, как правильно использовать truncate ... но если вы оказались в системе, отличной от POSIX, в которой нет unistd.h, тогда проще всего просто открыть файл для записи.и немедленно закройте его:

#include <stdio.h>

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

    fclose(file);
    return 0;
}

Открытие файла с помощью "w" (для режима записи) «очищает» файл, чтобы вы могли начать его перезаписывать;немедленно закрыв его, вы получите файл 0 длины.

5 голосов
/ 29 июня 2010

В * UNIX truncate() вызов просто:

truncate("/some/path/file", 0);
4 голосов
/ 29 июня 2010

Хотя вы можете просто открыть и закрыть файл, вызов 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;
}
1 голос
/ 29 июня 2010

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;
}
1 голос
/ 29 июня 2010

Для удаления содержимого файла, очевидно, существует базовый метод открытия файла в режиме записи "w", а затем его закрытия без внесения каких-либо изменений.

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

fclose(fp);

это удалит все данные в файле, так как при открытии уже существующего файла в режиме «w» файл удаляется, и для записи открывается новый файл с тем же именем, что приведет к удалению содержимого вашего файл.

НО в системах UNIX есть усеченный системный вызов, который специально предназначен для той же цели и довольно прост в использовании:

truncate (filepath, 0);

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

ftruncate (file_path, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...