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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление из бинарного файла 
:(
    Опции темы
DFooz
Дата 2.11.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как удалять из него информацию? Через поиск ничего не нашёл.
PM MAIL   Вверх
Kuvaldis
Дата 2.11.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



DFooz
можно делать как минимум, двумя способами:

1. Скопировать из исхходного файла в файл-буфер все, что идет до удаляемого куска. Потом то же самое для куска после. Старый файл удалить. Новый переименовать и дать имя старого.

2. Без использования дополнительного файла. 
   Сделать цикличесое копирование байтов справа налево на место удаляемых файлов. 
Поключаем #include <io.h> - самый низкий уровень
При помощи функции int chsize(int handle, long size) обрезать файл до нужного размера.
параметры для данной функции:
handle - дискриптор файла. Чтобы ты не парился, используй просто функцию fileno(fp), где fp - указатель файла (FILE* ). 
size - новый размер в байтах.
size = старый размер - размер удаляемого блока. 
старый размер можно узнать через функцию filelength(int handle)
Handle - то же, что и для chsize()  

2 способ проходит только для чистого С

Возможно, я не прав, так что пусть меня поправят если что, но НЕТ стандартного метода для работы с потоками (файлами) в стиле С++, который позволил бы обрезать файл

Это сообщение отредактировал(а) Kuvaldis - 2.11.2006, 19:41


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
DFooz
Дата 2.11.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



понятно.
в текстовых тоже только 2 этих способа работают?

Это сообщение отредактировал(а) DFooz - 2.11.2006, 20:01
PM MAIL   Вверх
Kuvaldis
Дата 2.11.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



DFooz
Цитата

в текстовых тоже только 2 этих способа работают?

в принципе да.
Но в текстовых файлах возможны неявные преобразования, например, '\n' - в последовательность '\10',  '\13', и обратно.
Поэтому я бы открыл текстовый файл в бинарном режиме (это можно) и сделал бы так, как написано выше 

Это сообщение отредактировал(а) Kuvaldis - 2.11.2006, 20:15


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
codelord
Дата 2.11.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



хотелось бы понять по какому принципу удаляется инфа, тем не 
менее если известен  точный размер данных которые нужно оставить и удалить
то пользуйся fseek();


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Kuvaldis
Дата 2.11.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



codelord
Цитата

если известен  точный размер данных которые нужно оставить и удалить
то пользуйся fseek();

К сожалению, fseek() только перемещает указатель файла в нужное место и всё. Данные файла можно будет только переписать поверх или записать дальше в конец файла. А само удаление - см. мой первый пост.
или вы что-то недоговорили smile 

Это сообщение отредактировал(а) Kuvaldis - 2.11.2006, 20:37


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
DFooz
Дата 2.11.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

хотелось бы понять по какому принципу удаляется инфа

по номеру записи (файл записей)
PM MAIL   Вверх
codelord
Дата 2.11.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



наверно не договорил или не додумал имел ввиду что ездить по файлу удалять его, после чего собрать и перезаписать 
похоже на твой вариант, есть еще мысль такая
допустим есть файл old.txt со следующим содержимым:
123456789qwertyuiopasdfghjklzxcvbnm
и мы знаем что символы которые надо удалить занимают позиции номер 10 11 12 13,
нам надо удалить  qwer,
делаем так smile.
Код

#include <stdio.h>
//функция определения размера файла.
long filesize(FILE *stream)
{
   long curpos, length;

   curpos = ftell(stream);
   fseek(stream, 0L, SEEK_END);
   length = ftell(stream);
   fseek(stream, curpos, SEEK_SET);
   return length;
}
//-----------------------------
void main()
{
FILE *in,*out;
in = fopen("old.txt","rb");
__int64 x = filesize(in); // pазмеp файла
int *file = new int[x],c,i=0;//создаем массив в который закинем файл 
x=0;
while((c=fgetc(in))!=EOF)
      {
      if(x>=9&&x<=12){x++;continue;}
      else {file[i]=c;i++;x++;}  // закидываем файл в массив в памяти.
      }
fclose(in);
out=fopen("old.txt","wb");
for(int x=0;x<i;x++)
        {
        fputc(file[x],out); //перезаписываем файл.
        }
fclose(out);
}

думаю с массивом работать с произвольным доступом проще чем с файлом


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Romikgy
Дата 2.11.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



я так понял , делается что то типа базы данных, и посоветую делать также как в DB в записи есть поле которое помечает что запись удалена,
а при архивации все записи помечаные как удаленые удаляются,
скорость работы повышается + появляется возможность откатится smile

Добавлено @ 22:48 
codelord, а если файл в 100 мегабайт   smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
codelord
Дата 2.11.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



Цитата(DFooz @  2.11.2006,  18:39 Найти цитируемый пост)
по номеру записи (файл записей)

т.е. всеравно не понял,smile
 приведи кусочек файла.

Добавлено @ 22:50 
Цитата(Romikgy @  2.11.2006,  18:46 Найти цитируемый пост)
codelord, а если файл в 100 мегабайт 

ну наверно будет не быстро smile.
хотя тут надо уточнять и размер файла и потребности.



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
codelord
Дата 2.11.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



п.с. на моем скромном компьютере приблизительно 10 мегов в сек.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
DFooz
Дата 2.11.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

т.е. всеравно не понял,smile
 приведи кусочек файла.


Код

//my debtors 16:05 28.10.2006

#include <iostream.h>
#include <conio.h>
#include <fstream.h>
#include <stdlib.h> 
#include <iomanip.h>

inline void eatline() { while (cin.get() != '\n') continue; }
struct  debtor 
{
    char name[20];
    char description[20];
    int quantity;
    char date[20];
};

const char * file = "debtors.dat";

void main(void)
{
    clrscr();
    debtor db;
    cout.setf(ios::fixed, ios::right);

//show initial contents    
    ifstream fin;
    fin.open(file, ios::in | ios::binary);
    if (fin)
    {
        cout << "Here are the current contents of the"
            << file << " file: \n\n";
        cout << setw(20) << "name" << setw(20) << "description"
                << setw(10) << "quantity" << setw(20) << "date" << endl;
        while (fin.read((char *) &db, sizeof db))
        {
            cout << setw(20) << db.name << setw(20) << db.description
                << setw(10) << db.quantity << setw(20) << db.date << endl;
        }
    }
    fin.close();

//add new data    
    ofstream fout(file, ios::out | ios::app | ios::binary);
    if (!fout)
    {
        cerr << "Can't open " << file << " file for output: \n";
        exit(1);
    }
    
    cout << "Enter debtor name (enter a blank line to quit):\n";
    cin.get(db.name, 20);
    while (db.name[0] != '\0')
    {
        eatline();
        cout << "Enter description of good: ";
        cin.get(db.description, 20);
        eatline();
        cout << "Enter quantity of good: ";
        cin >> db.quantity;
        eatline();
        cout << "Enter date: ";
        cin.get(db.date, 20);
        eatline();
        fout.write((char *) &db, sizeof db);
        cout << "\n\nEnter debtor name (enter a blank line to quit):\n";
        cin.get(db.name, 20);        
    }
    fout.close();

//show revised file
    fin.clear();
    fin.open(file, ios::in | ios::binary);
    if (fin)
    {
        cout << "Here are the new contents of the " << file << " file";
        while (fin.read((char *) &db, sizeof db))
        {
            cout << setw(20) << "name" << setw(20) << "description" 
                << setw(10) << "quantity" << setw(20) << "date" << endl;
        }
    }
    fin.close();
    
    cout << "Done\n";
    getch();
}




Цитата

в DB в записи есть поле которое помечает что запись удалена


ЧТо такое DB? Как примерно пометить? В новый файл записать, что хочу удалить?
PM MAIL   Вверх
codelord
Дата 2.11.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



извини может выразился не верно, я имел ввиду кусочек файла с которым надо работать, 
т.е. из которого надо удалять.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Romikgy
Дата 2.11.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

struct  debtor 
{
    char name[20];
    char description[20];
    int quantity;
    char date[20];
    char del; // в него и будем писать что запись удалена допустим 1 удалена.
};


Цитата(DFooz @  2.11.2006,  22:24 Найти цитируемый пост)
DB

DataBase
Цитата(DFooz @  2.11.2006,  22:24 Найти цитируемый пост)
В новый файл записать, что хочу удалить? 

нет просто будешь находить в файле позицию и помечать как удаленную запись , а после всех действий или через время , допустим через неделю, будешь выкидывать все удаленые, для сохранения места на диске


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
DFooz
Дата 2.11.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Romikgy
, понятно.
Цитата


извини может выразился не верно, я имел ввиду кусочек файла с которым надо работать, 
т.е. из которого надо удалять.

чего извиняться-то=)
что-то типа такого:
Петя        диск        1      19.04.2006

такая структура
Код

struct  debtor 
{
    char name[20];
    char description[20];
    int quantity;
    char date[20];
    };


Это сообщение отредактировал(а) DFooz - 2.11.2006, 23:44
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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