Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Усечение файла, юзаю fstream 
:(
    Опции темы
Igor_K
Дата 4.5.2008, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Здравствуйте!  smile 

Извините что так часто создаю темы. Но без вас никуда smile 

Я уже работаю с файлами. Использую класс fstream.
Столкнулся с некоторыми проблемами.

Работаю с файлом в бинарном режиме. Запихую туда структуры.
Например мне надо удалить некоторую структуру с файла. Я делаю типа f[i] = f[i+1] . Но последний елемент остается. Как его удалить оттуда?

И еще вопрос как можно узнать размер файла?
PM MAIL   Вверх
Igor_K
Дата 4.5.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



А есть ли стандартная функция в С++ которая удаляет кусок файла по диапазону байт?
Например урезать файл от 2500 до 3000 байт
PM MAIL   Вверх
bsa
Дата 5.5.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



удалить из середины способа нет. Можно в начале файла указывать сколько в нем актуальных записей.
узнать размер файла можно методом seek - если позиционироваться на конец файла (0, SEEK_END), то метод вернет размер файла. затем нужно будет только вернуть позицию в начало.
PM   Вверх
Igor_K
Дата 5.5.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



bsa, я понимаю что с средины нельзя удалить. Я делаю смещение елементов f[i] = f[i+1] и в конце получается лишний. мне его нужно удалить. То есть отсечь от конца файла, например 100 байт. 

Юзаю под командную строку. 


Цитата(bsa @  5.5.2008,  12:09 Найти цитируемый пост)
Можно в начале файла указывать сколько в нем актуальных записей.

А при этом все не актуальные удалятся?


Цитата(bsa @  5.5.2008,  12:09 Найти цитируемый пост)
узнать размер файла можно методом seek - если позиционироваться на конец файла (0, SEEK_END), то метод вернет размер файла. 

Спасибо! smile буду теперь знать хоть это smile 
PM MAIL   Вверх
bsa
Дата 5.5.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Igor_K @ 5.5.2008,  12:18)
Цитата(bsa @  5.5.2008,  12:09 Найти цитируемый пост)
Можно в начале файла указывать сколько в нем актуальных записей.

А при этом все не актуальные удалятся?

нет конечно.
стандартных способов уменьшить размер файла мне неизвестно. В Win32Api, кажется, была соответсвующая функция.
PM   Вверх
Igor_K
Дата 5.5.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Мне тут в голову разные кривые мысли приходят smile 

Можно ли например
1. Открыть файл.
2. Считать кудато(не знаю куда) нужное количество байт.
  Только от куда можно считать файл? Можно ли его считать весь в память? Если можно то как? Или его нужно копировать в временный файл? С этим я не знаю что делать.

3. Потом закрыть файл и открыть с флагом ios_base::trunc И записать туда то что получили в пункте 2.


Это все до чего я додумался. С пунктом 2 не могу разобраться только.
PM MAIL   Вверх
bsa
Дата 5.5.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Igor_K, твою последовательность действий можно рационализировать так:
1. выделить N байт под буфер (malloc или std::vector<char> тебе в помощь)
2. открыть основной файл
3. создать временный файл в той же папке, что и основной
4. попытаться считать N байт из основного файла в буфер 
5. записать считанное число байт из буфера во временный файл
6. повторять пп. 4,5 пока основной файл не закончится (т.е. не закончатся нужные данные)
7. закрыть файлы.
8. удалить основной файл
9. переименовать временный файл в основной
PM   Вверх
JackYF
Дата 5.5.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Вот, кусочек из своего, проверенного:

Код

void file_truncate(const std::string& file_name, size_t new_size)
        {
            #ifdef OS_WINDOWS
                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 );
            #elif defined(OS_LINUX)
                truncate( file_name.c_str(), new_size );
            #else
                #error yf::file::file_truncate() - Unsupported OS
            #endif
        }



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Igor_K
Дата 5.5.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



JackYF, только бы разобраться как с ним работать. 
Ошибка при компиляции [C++ Error] Unit1.cpp(87): E2141 Declaration syntax error
PM MAIL   Вверх
JackYF
Дата 5.5.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Igor_K @  5.5.2008,  14:24 Найти цитируемый пост)
JackYF, только бы разобраться как с ним работать. 

Ну, для винды тебе нужны только четыре строчки для Windows.

И вообще, банальный копипаст никогда не рулил.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Igor_K
Дата 5.5.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Цитата(JackYF @  5.5.2008,  15:50 Найти цитируемый пост)
Ну, для винды тебе нужны только четыре строчки для Windows.

Я это понял

Подключил 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 );
        }
компилятор ругается.
PM MAIL   Вверх
bsa
Дата 5.5.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Igor_K, а ты #include <string> сделал?
PM   Вверх
Lycifer
Дата 5.5.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Во первых: не используй 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 );
Создаётся файл тебе нужно считывать из файла.

Да и пиши в таки случаях свой код!!!! smile 
PM MAIL ICQ   Вверх
JackYF
Дата 5.5.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Lycifer @  5.5.2008,  15:53 Найти цитируемый пост)
В третих я так понял ты под консоль приложения поэтуму не используй WinAPI

Это ещё почему?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Lycifer
Дата 6.5.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Потому что не имеет смысла точится под Windows без нужды(это не только под Windows, а в целом не под какую ОС)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.