Я использую 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);