fstream неужели так?
От: AviSergey  
Дата: 02.01.10 23:57
Оценка:
Доброго времени всем!
Оч. быстро надо накидать API для работы с БД, представленной обычным бинарным файлом. Использовал для обращения к файлу fstream, и при реализации функции обновления столкнулся с тем что, сходу не нахожу такой комбинации режимов открытия, к-я давала бы возможность записи в произвольное место контента файла (например посредством метода seekp) не затирая предыдущий файл.
С точки зрения сохранения единства написания не хочется переходить на др. вариант, да и самому стало интересно, неужели это невозможно.
Надеюсь, что что-то упустил, жду ваших оперативных коментов?
Re: fstream неужели так?
От: LaptevVV Россия  
Дата: 03.01.10 06:59
Оценка:
Здравствуйте, AviSergey, Вы писали:

AS>Доброго времени всем!

AS>Оч. быстро надо накидать API для работы с БД, представленной обычным бинарным файлом. Использовал для обращения к файлу fstream, и при реализации функции обновления столкнулся с тем что, сходу не нахожу такой комбинации режимов открытия, к-я давала бы возможность записи в произвольное место контента файла (например посредством метода seekp) не затирая предыдущий файл.
Не понял. Существующий файл всегда можно открыть, не затирая. Задай режимы binary|in|out
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: fstream неужели так?
От: Nicky_  
Дата: 03.01.10 09:44
Оценка:
Здравствуйте, AviSergey, Вы писали:

AS>Доброго времени всем!

AS>Оч. быстро надо накидать API для работы с БД, представленной обычным бинарным файлом. Использовал для обращения к файлу fstream, и при реализации функции обновления столкнулся с тем что, сходу не нахожу такой комбинации режимов открытия, к-я давала бы возможность записи в произвольное место контента файла (например посредством метода seekp) не затирая предыдущий файл.
AS>С точки зрения сохранения единства написания не хочется переходить на др. вариант, да и самому стало интересно, неужели это невозможно.
AS>Надеюсь, что что-то упустил, жду ваших оперативных коментов?

Наверное имеется ввиду вставка в середину файла, со сдвигом остатка. Тогда обычно создается еще один файл, куда сначала копируется верхняя часть, затем втавляемые данные, а затем нижняя часть. Если не ошибаюсь, так делают почти все субд.
Если же дозаписать в середину как вы говорите, то нижний конец файла просто потеряется
Re[2]: fstream неужели так?
От: AviSergey  
Дата: 03.01.10 13:08
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Не понял. Существующий файл всегда можно открыть, не затирая. Задай режимы binary|in|out


Режим ios_base::out — приводит к усечению сущ-го файла, весьма странно..
Re[2]: fstream неужели так?
От: AviSergey  
Дата: 03.01.10 13:24
Оценка:
Здравствуйте, Nicky_, Вы писали:

N_>Наверное имеется ввиду вставка в середину файла, со сдвигом остатка. Тогда обычно создается еще один файл, куда сначала копируется верхняя часть, затем втавляемые данные, а затем нижняя часть. Если не ошибаюсь, так делают почти все субд.

N_>Если же дозаписать в середину как вы говорите, то нижний конец файла просто потеряется

Поняли вы все верно. В данном случае одна единица(считайте строка таблицы) имеет строго регламентированный формат фиксированной длины. Естественно, перезапись всего файла при каждой операции обновления как минимум не производительное решение.
Возможностей реализации такой вставки несколько, простеший пример:


//val - стуктура одной строки

FILE* f = fopen(path,"rb+");
fseek(f, ind*sizeof(val), SEEK_SET);
fwrite((char*) &val, sizeof(val), 1, f);
fclose(f);


Просто я удивлен, что не могу найти пока варианта для реализации посредством fstream.
Надеюсь что чем-то ошибаюсь...
Re[3]: fstream неужели так?
От: LaptevVV Россия  
Дата: 03.01.10 15:37
Оценка:
Здравствуйте, AviSergey, Вы писали:

AS>Здравствуйте, LaptevVV, Вы писали:


LVV>>Не понял. Существующий файл всегда можно открыть, не затирая. Задай режимы binary|in|out


AS>Режим ios_base::out — приводит к усечению сущ-го файла, весьма странно..

Это действительно странно.
Потому как мои студенты-первокурсники каждый год выполняют упражнение:

Нужно написать функцию, с помощью которой подготовить входной файл, записав в него 100 случайных целых чисел в диапазоне от –50 до +50 по одному на строке. Сформировать выходной файл, преобразовав числа входного файла.

Исполняют в разных вариантах, одним из которых является следующий:

Реализовать задания 1–20 с одним исходным двоичным файлом, выполнив перезапись по месту. Для проверки результата написать функцию вывода двоичного файла на экран.

И все прекрасно работает. Ничего не затирается и все прекрасно перезаписывается по месту.
Но файл открывается именно как входной-выходной, как я написал.
Кстати, режим открытия задавайте в методе open(), а не при объявлении объекта типа файл.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: fstream неужели так?
От: TheBeard Россия  
Дата: 03.01.10 16:45
Оценка:
Здравствуйте, Nicky_, Вы писали:

AS>>Оч. быстро надо накидать API для работы с БД, представленной обычным бинарным файлом. Использовал для обращения к файлу fstream, и при реализации функции обновления столкнулся с тем что, сходу не нахожу такой комбинации режимов открытия, к-я давала бы возможность записи в произвольное место контента файла (например посредством метода seekp) не затирая предыдущий файл.


N_>Наверное имеется ввиду вставка в середину файла, со сдвигом остатка. Тогда обычно создается еще один файл, куда сначала копируется верхняя часть, затем втавляемые данные, а затем нижняя часть. Если не ошибаюсь, так делают почти все субд.

N_>Если же дозаписать в середину как вы говорите, то нижний конец файла просто потеряется

Что-то не верится. Пусть нам надо вставить запись в 100 байт в начало таблицы, где их уже лежит 10 миллионов (по 100 байт). Мы гигабайт будем двигать на диске? ИМХО, вменяемые СУБД пишут в хвост таблицы в порядке поступления, а для упорядочения используют индексы.

To AviSergey: fstream просто не предназначен для решения подобных задач. Не мучайтесь понапрасну.
Re[3]: fstream неужели так?
От: mrEvil  
Дата: 05.01.10 01:21
Оценка:
Здравствуйте, AviSergey, Вы писали:

AS>Возможностей реализации такой вставки несколько, простеший пример:


AS>

AS>//val - стуктура одной строки

AS>FILE* f = fopen(path,"rb+");
AS>fseek(f, ind*sizeof(val), SEEK_SET);
AS>fwrite((char*) &val, sizeof(val), 1, f);
AS>fclose(f);

AS>

AS>Просто я удивлен, что не могу найти пока варианта для реализации посредством fstream.
AS>Надеюсь что чем-то ошибаюсь...

Не проверял, но

fstream f;
//..........
f.seekp(...)
f.write(...)
f.close()

Разве не даст такой же результат?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.