| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Усечение файла |
| Автор: Igor_K 4.5.2008, 19:28 |
| Здравствуйте! Извините что так часто создаю темы. Но без вас никуда Я уже работаю с файлами. Использую класс fstream. Столкнулся с некоторыми проблемами. Работаю с файлом в бинарном режиме. Запихую туда структуры. Например мне надо удалить некоторую структуру с файла. Я делаю типа f[i] = f[i+1] . Но последний елемент остается. Как его удалить оттуда? И еще вопрос как можно узнать размер файла? |
| Автор: Igor_K 4.5.2008, 20:59 |
| А есть ли стандартная функция в С++ которая удаляет кусок файла по диапазону байт? Например урезать файл от 2500 до 3000 байт |
| Автор: bsa 5.5.2008, 12:09 |
| удалить из середины способа нет. Можно в начале файла указывать сколько в нем актуальных записей. узнать размер файла можно методом seek - если позиционироваться на конец файла (0, SEEK_END), то метод вернет размер файла. затем нужно будет только вернуть позицию в начало. |
| Автор: bsa 5.5.2008, 12:24 | ||
нет конечно. стандартных способов уменьшить размер файла мне неизвестно. В Win32Api, кажется, была соответсвующая функция. |
| Автор: Igor_K 5.5.2008, 12:33 |
| Мне тут в голову разные кривые мысли приходят Можно ли например 1. Открыть файл. 2. Считать кудато(не знаю куда) нужное количество байт. Только от куда можно считать файл? Можно ли его считать весь в память? Если можно то как? Или его нужно копировать в временный файл? С этим я не знаю что делать. 3. Потом закрыть файл и открыть с флагом ios_base::trunc И записать туда то что получили в пункте 2. Это все до чего я додумался. С пунктом 2 не могу разобраться только. |
| Автор: bsa 5.5.2008, 13:58 |
| Igor_K, твою последовательность действий можно рационализировать так: 1. выделить N байт под буфер (malloc или std::vector<char> тебе в помощь) 2. открыть основной файл 3. создать временный файл в той же папке, что и основной 4. попытаться считать N байт из основного файла в буфер 5. записать считанное число байт из буфера во временный файл 6. повторять пп. 4,5 пока основной файл не закончится (т.е. не закончатся нужные данные) 7. закрыть файлы. 8. удалить основной файл 9. переименовать временный файл в основной |
| Автор: JackYF 5.5.2008, 15:16 | ||
Вот, кусочек из своего, проверенного:
|
| Автор: Igor_K 5.5.2008, 15:24 |
| JackYF, только бы разобраться как с ним работать. Ошибка при компиляции [C++ Error] Unit1.cpp(87): E2141 Declaration syntax error |
| Автор: JackYF 5.5.2008, 15:50 |
Ну, для винды тебе нужны только четыре строчки для Windows. И вообще, банальный копипаст никогда не рулил. |
| Автор: Igor_K 5.5.2008, 15:59 |
Я это понял Подключил windows.h Удалил лишнее void file_truncate(const std::string& file_name, size_t new_size) { HANDLE h_file = CreateFile( file_name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 ); SetFilePointer( h_file, new_size, 0, FILE_CURRENT ); SetEndOfFile( h_file ); CloseHandle( h_file ); } компилятор ругается. |
| Автор: bsa 5.5.2008, 16:49 |
| Igor_K, а ты #include <string> сделал? |
| Автор: Lycifer 5.5.2008, 16:53 |
| Во первых: не используй Borland - это самые большые глюки и тормаза Во вторых пиши что пишет компилятор В третих я так понял ты под консоль приложения поэтуму не используй WinAPI В четвёртых если всё же используеж, то в HANDLE h_file = CreateFile( file_name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 ); SetFilePointer( h_file, new_size, 0, FILE_CURRENT ); SetEndOfFile( h_file ); CloseHandle( h_file ); Создаётся файл тебе нужно считывать из файла. Да и пиши в таки случаях свой код!!!! |
| Автор: JackYF 5.5.2008, 18:15 | ||
Это ещё почему? |
| Автор: Lycifer 6.5.2008, 10:21 |
| Потому что не имеет смысла точится под Windows без нужды(это не только под Windows, а в целом не под какую ОС) |
| Автор: JackYF 6.5.2008, 13:22 |
У тебя есть лучшее решение, отличающееся от того, что я привёл несколько ранее в теме (там где #ifdef) ? |
| Автор: bsa 6.5.2008, 23:17 | ||
Как вариант можно использовать http://msdn.microsoft.com/en-us/library/dk925tyb(VS.80).aspx под Windows:
|
| Автор: Igor_K 7.5.2008, 11:27 |
| bsa, спасибо!!! |