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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить строку, из файла 
V
    Опции темы
bsa
Дата 29.6.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rickert @ 29.6.2007,  08:42)
Мне вот интересно, а тот же Mysql работает через дамп в памяти?

Во-первых, там принцип совершенно иной. Думаю, там записи помечаются "удаленными" при удалении, а добавляемые заполняют их место. Но, если честно, я этим сильно не интересовался, поэтому там могут быть другие методы.
Во-вторых, отображение в память это очень удобный способ работы с файлами, поэтому скорее всего, он там используется.

Но никто не мешает тебе самому это узнать - исходники mysql доступны.

Цитата(jonie @ 29.6.2007, 08:22)
любое удаление "в середине" требует создание нового файла, с вырезанием содержимого. НЕТ других способов "вырезки".
Новый файл создавать совсем не обязательно. Можно изменить старый. Как это делать было написано в самом начале. Я лишь повторю:
Способ №1:
Код
void *buffer = malloc(BUF_SIZE);
off_t pos1 = lseek(fd, 0, SEEK_CUR); //удаляем начиная с текущей позиции
off_t pos2 = lseek(fd, del_size, SEEK_CUR); //del_size байт
while(1) {
    int r = read(fd, buffer, BUF_SIZE);
    if (r < 0)
         break; //ошибка
    pos1 = lseek(fd, pos1, SEEK_SET);
    write(fd, buffer, r);
    pos2 = lseek(fd, pos2 + r, SEEK_SET);
    if (r != BUF_SIZE)
        break;
}
free(buffer);

Способ №2:
Код
int fd = open("filename", O_RDWR);
off_t file_size = lseek(fd, 0, SEEK_END);
const long page_size = sysconf(_SC_PAGE_SIZE);
if (file_size % page_size)
     file_size = (file_size + page_size) - (file_size % page_size);

char *buffer = (char*)mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (buffer == MAP_FAILED)
     exit(1);//ошибка
assert(pos1 < pos2);
memcpy(buffer + pos1, buffer + pos2, file_size - pos2); //удаляем кусок между pos1 и pos2
munmap(buffer);

PM   Вверх
MAKCim
Дата 29.6.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



для простоты возьмем файл такой структуры: есть строки текста одинаковой длины (допустим length), которые разделены символом Ah
нужно в файле вырезать строку с номером number
Код

#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int cut(int file, int number, int length) {
    int error = 0;
    void *buf = malloc(length);
    if (ptr == NULL) {
        error = ENOMEM;
        goto free;
    }
    off_t r_offset = (length + 1) * number, 
             w_offset = r_offset - length - 1;
    ssize_t size;
    while (1) {
        lseek(file, r_offset, SEEK_SET);
        if ((size = read(file, buf, length)) < 0) {
            error = errno;
            goto free;
        }
        else if (size == 0)
            break;
        lseek(file, w_offset, SEEK_SET);
        write(file, buf, size);
        w_offset = r_offset;
        r_offset += length + 1;
    }
    ftruncate(file, w_offset);
free:
    free(buf);
    return error;
}

int main() {
    int file = open(PATH, O_RDWR);
    cat(file, 4, 1);
    close(file);
    return 0;
}

файл PATH для примера такой
Цитата

1
2
3
4
5
6
7


Добавлено @ 10:49
bsa, 
гы, как код похож  smile 
(я у тебя не смотрел, честное слово  smile)
да кстати, у тебя размер файла остается прежним  smile 

Это сообщение отредактировал(а) MAKCim - 29.6.2007, 10:51


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
jonie
Дата 29.6.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата

Новый файл создавать совсем не обязательно. Можно изменить старый...
ну, незначительные вариации) фактически-то суть одна.... пишем до "вырезки", пропускаем "вырезку", дописываем концовку...
Цитата

Просто не люблю, когда на вопрос отвечают вопросом.
че нервничать-то... алтернативы всегда стоит рассматривать - все зависит от задачи.
Цитата

Ты спрашиваешь: как заточить лопату, хочу поле перекопать, а тебе говорят: а чем тебя трактор не устраивает? тоже самое 
при необходимости я смогу ответить на этот вопрос, а не тупо ответить "потому что".
----
сложно чтоли ответить было "специфика задачи подразумевает использование только текстового файла" ? и не былоб споров  smile 


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MAKCim
Дата 29.6.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(jonie @  29.6.2007,  14:50 Найти цитируемый пост)
ну, незначительные вариации) фактически-то суть одна.... пишем до "вырезки", пропускаем "вырезку", дописываем концовку...

как раз суть разная
мы до вырезки не пишем  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinter
Дата 29.6.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



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


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 29.6.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



vinter, 
это невозможно
по крайней мере если вырезаемый кусок не кратен размеру сектора


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 29.6.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @ 29.6.2007,  19:42)
vinter, 
это невозможно
по крайней мере если вырезаемый кусок не кратен размеру сектора

Нет. Условие более жесткое - если не кратен размеру кластера!
PM   Вверх
MAKCim
Дата 29.6.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(bsa @  29.6.2007,  19:57 Найти цитируемый пост)
Нет. Условие более жесткое - если не кратен размеру кластера!

у нас какая ФС, FATx чтоли?
современные ФС для файла создают связный список используемых секторов, поэтому в случае если вырезаемый кусок занимает n-ое количество секторов с кратным размеру сектора базовым адресом, его возможно вырезать без записи (несколько операций над списком)

Это сообщение отредактировал(а) MAKCim - 29.6.2007, 20:51


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



вот поэтому я был сильно удивлен smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
W4FhLF
Дата 30.6.2007, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Раздел делфи тоже иногда полезно читатьsmile 

http://forum.vingrad.ru/forum/topic-160549.html


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Rickert
Дата 30.6.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Всем спасибо smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
bsa
Дата 1.7.2007, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @ 29.6.2007,  20:48)
у нас какая ФС, FATx чтоли?
современные ФС для файла создают связный список используемых секторов, поэтому в случае если вырезаемый кусок занимает n-ое количество секторов с кратным размеру сектора базовым адресом, его возможно вырезать без записи (несколько операций над списком)

Странно. А что тогда у NTFS за размер перед форматированием (в т.ч. и быстрым) задается в менеджере дисков?
PM   Вверх
MAKCim
Дата 1.7.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(bsa @  1.7.2007,  19:25 Найти цитируемый пост)
Странно. А что тогда у NTFS за размер перед форматированием (в т.ч. и быстрым) задается в менеджере дисков? 

честно говоря не знаю  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 2.7.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А я скажу: "Размер кластера" от 512 байт до 64К.
user posted image
PM   Вверх
MAKCim
Дата 2.7.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



bsa, 
все, понял
ты прав  smile 
но суть работы со связными списками не меняется


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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