Ответ 1
В системах Windows нет заголовка <unistd.h>
, но вы можете обрезать файл с помощью
_chsize( fileno(f), size);
Я использую C для записи некоторых данных в файл. Я хочу стереть предыдущий текст, записанный в файле, если он был длиннее, чем я сейчас пишу. Я хочу уменьшить размер файла или усечь до конца. Как я могу это сделать?
В системах Windows нет заголовка <unistd.h>
, но вы можете обрезать файл с помощью
_chsize( fileno(f), size);
Если вы хотите сохранить предыдущее содержимое файла до некоторой длины (длина больше нуля, которую предоставляют другие ответы), то 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()
, как описано в ответе на более мягкой.
Это функция вашей операционной системы. Стандартный способ POSIX для этого:
open("file", O_TRUNC | O_WRONLY);
Если это нужно запустить под некоторым вкусом 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. Обратите внимание, что эти вызовы фактически увеличивают размер файла (!), Если вы передадите длину, большую, чем текущая длина.
Если вы хотите обрезать весь файл, открытие файла для записи делает это для вас. В противном случае вам нужно открыть файл для чтения и прочитать части файла, который вы хотите сохранить во временную переменную, а затем вывести его туда, где вам нужно.
Обрезать весь файл:
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.
< редактировать >
А, вы отредактировали свой пост, вы используете C. Когда вы открываете файл, откройте его в режиме "w +", как это, и он усекает его, чтобы он был готов для записи:
FILE* f = fopen("C:\\gabehabe.txt", "w+");
fclose(file);
</редактировать >
Чтобы усечь файл на С++, вы можете просто создать объект-объект для файла, используя ios_base:: trunc в качестве файлового режима для его усечения, например:
ofstream x("C:\\gabehabe.txt", ios_base::trunc);