Я использую C для записи некоторых данных в файл. Я хочу стереть предыдущий текст, записанный в файле, если он был длиннее, чем я сейчас пишу. Я хочу уменьшить размер файла или усечь до конца. Как я могу это сделать?Как усечь файл в C?
ответ
В системах Windows, нет заголовка <unistd.h>
, но все же вы можете обрезать файл с помощью
_chsize(fileno(f), size);
Это функция вашей операционной системы. Стандарт POSIX способ сделать это:
open("file", O_TRUNC | O_WRONLY);
Это обрезает файл размером 0 байт. – chmike
Если вы хотите укоротить весь файл, открыв файл для написания делает это для вас. В противном случае вам нужно открыть файл для чтения и прочитать части файла, который вы хотите сохранить во временную переменную, а затем вывести его туда, где вам нужно.
Обрезать весь файл:
FILE *file = fopen("filename.txt", "w"); //automatically clears the entire file for you.
Truncate часть файла:
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.
Это очень неэффективный способ выполнить это. Метод @Jonathan Leffler намного предпочтительнее, и если ваша платформа не разрешает его, по крайней мере, цикл записи/переименования, чтобы предотвратить dataloss в случае сбоя (скопируйте данные в новый файл под именем temp, затем замените имена (если возможно, атомно), а затем удалить старый файл) – derobert
< редактировать >
Ах, вы редактировали ваше сообщение, вы используете C. Когда вы откроете файл, откройте его с помощью режима «w +», как это, и он усекает его, чтобы он был готов к записи:
FILE* f = fopen("C:\\gabehabe.txt", "w+");
fclose(file);
</редактировать >
Чтобы усечь файл в C++, вы можете просто создать объект ofstream в файл, используя ios_base :: TRUNC как режим файла укоротить его, как так:
ofstream x("C:\\gabehabe.txt", ios_base::trunc);
fopen усекает содержимое файла «gabehabe.txt» и указатель файла позиции в начало, не так ли? Но будет ли оно пустым содержимое файла перед повторной установкой указателя файла? – Arpith
Если вы хотите сохранить предыдущее содержимое файла до некоторой длины (длина больше нуля, которые обеспечивают другие ответы), то Р OSIX предоставляет функции 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
) доступ к одному файлу склонно привести к путанице - видеть комментарии для некоторых вопросов , Это должно быть последним средством.
Скорее всего, что для ваших целей обрезать на открытом месте все, что вам нужно, и для этого вариантов, предоставленных другими, будет достаточно.
Две минуты вперед ... приятно! –
Замечательно похоже, Ланс! По крайней мере, один из нас, вероятно, получил информацию правильно. (Использование
Есть ли такая функция в C++ vs 2003, я не смог ее найти? Без участия помогло, может быть, я что-то пропустил? Я не хочу открывать файл с помощью w, но использовать уже использованный файл – sofr
Если это запустить под некоторым привкусом UNIX, эти интерфейсы должны быть доступны:
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
Согласно «человеку срезанному» на моей коробке Linux, это POSIX соответствующих требований. Обратите внимание, что эти вызовы фактически увеличивают размер файла (!), Если вы передадите длину больше текущей.
- 1. Как усечь в C
- 2. Как усечь список в C#?
- 3. Как усечь файл в начале в PHP?
- 4. Как я могу усечь строку в c?
- 5. Усечь десятичное значение в C++
- 6. Усечь целое число в C
- 7. Как ограничить/усечь массив?
- 8. Как усечь строку [формирование]?
- 9. Усечь пол в три десятичные точки C++
- 10. Усечь директорию в bash
- 11. Как усечь строку в эликсире?
- 12. Как отрезать или усечь строки из текстового файла в C
- 13. Усечь файл Имя и и переименовать
- 14. Как усечь двойное значение?
- 15. Как усечь строку .NET?
- 16. Как усечь текст?
- 17. Как усечь числа?
- 18. Как усечь заголовок HWND
- 19. Как усечь первую цифру числа?
- 20. Как усечь файл в файловой системе FAT32 без нулевого заполнения в C?
- 21. Усечь строку
- 22. Как усечь строку при преобразовании в байты на C#?
- 23. Как усечь файл до определенного размера, но сохранить конечный раздел?
- 24. Как усечь десятичную часть в Asp.Net MVC3
- 25. Как усечь выражение форматирования форматирования
- 26. Как усечь вывод дополнений 2
- 27. Как усечь строку в виде codeigniter
- 28. Как усечь десятичное пространство в TSQL?
- 29. Как усечь datatable в набор данных
- 30. Как усечь десятичное число в PHP?
_chsize_s для 64 бит: _chsize_s (_fileno (f), размер); – Gyuri
Функция _fileno действительно помогает, если мы используем структуру FILE – Carthi
Разве это не только функция MS-Windows ?! –