Как усечь файл в C?

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

Ответ 1

В системах Windows нет заголовка <unistd.h>, но вы можете обрезать файл с помощью

 _chsize( fileno(f), size);

Ответ 2

Если вы хотите сохранить предыдущее содержимое файла до некоторой длины (длина больше нуля, которую предоставляют другие ответы), то POSIX предоставляет truncate() и ftruncate() функции для работы.

#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);

Название указывает на основную цель - сокращение файла. Но если указанная длина больше, чем предыдущая, файл увеличивается (заполнение нулями) до нового размера. Обратите внимание, что ftruncate() работает с дескриптором файла, а не с FILE *; Вы можете использовать:

if (ftruncate(fileno(fp), new_length) != 0) ...error handling...

Однако вы должны знать, что смешение потоков файлов (FILE *) и файлового дескриптора (int) доступа к одному файлу может привести к путанице - см. комментарии к некоторым проблемам. Это должно быть последним средством.

Впрочем, вполне вероятно, что для ваших целей урезание при открытии - это все, что вам нужно, и для этого будет достаточно вариантов, предоставленных другими.


Для Windows есть функция SetEndOfFile() и связанная функция SetFileValidData(), которая может выполнять аналогичную работу, но с использованием другого интерфейса. По сути, вы ищете место, где вы хотите установить конец файла, а затем вызываете функцию.

Также есть функция _chsize(), как описано в ответе на более мягкой.

Ответ 3

Это функция вашей операционной системы. Стандартный способ POSIX для этого:

open("file", O_TRUNC | O_WRONLY);

Ответ 4

Если это нужно запустить под некоторым вкусом UNIX, эти API должны быть доступны:

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

   int truncate(const char *path, off_t length);
   int ftruncate(int fd, off_t length);

В соответствии с "man truncate" в моем ящике Linux они соответствуют POSIX. Обратите внимание, что эти вызовы фактически увеличивают размер файла (!), Если вы передадите длину, большую, чем текущая длина.

Ответ 5

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

Обрезать весь файл:

FILE *file = fopen("filename.txt", "w"); //automatically clears the entire file for you.

Обрезать часть файла:

FILE *inFile("filename.txt", "r");
//read in the data you want to keep
fclose(inFile);
FILE *outFile("filename.txt", "w");
//output back the data you want to keep into the file, or what you want to output.

Ответ 6

< редактировать >

А, вы отредактировали свой пост, вы используете C. Когда вы открываете файл, откройте его в режиме "w +", как это, и он усекает его, чтобы он был готов для записи:

FILE* f = fopen("C:\\gabehabe.txt", "w+");
fclose(file);

</редактировать >

Чтобы усечь файл на С++, вы можете просто создать объект-объект для файла, используя ios_base:: trunc в качестве файлового режима для его усечения, например:

ofstream x("C:\\gabehabe.txt", ios_base::trunc);