C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Загружаю/записываю информацию, философский вопрос
Schumi
Отправлено: 25.11.2004, 21:50


Машинист паровоза

Группа: Участник
Сообщений: 206



Представьте,есть программа,которая что-то делает и результаты,естественно,записывает,потом читает...
Допустим чтение:условно,пишем в первый байт число каких-то данных,потом последовательно пишем эти данные (любые),.....
А теперь,считали в буфер:если файл испорчен,отрезали кусочек в конце,или в середине пакоцали.Берем,пошагово в соответствии со структурой файла,начинаем читать — так как бы не промахнуть.Читаем столько-то элементов,начинаем читать,дальше тоже сколько-то читаем.И не получится:char *Buf — сюда считали файл на 300 байт,а где-то будем обращаться Buf[Pos=654],предполагая,что файл целый.
Ведь ошибки он не выдаст.Получается надо в холостую просматривать всю структуру файл,и исходя из данных смотреть какая длина получается и какая есть.

По поводу записи: тоже я знаю что надо писать,всяких данных навернутых.Но сперва нужно ведь выделить памяти,а сколько — что тоже в холостую проходить цепочку по всем данным,подсчитывать объем,и уже по второму разу писать?
AVC
Отправлено: 26.11.2004, 09:10


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Допустим чтение:условно,пишем в первый байт число каких-то данных,потом последовательно пишем эти данные (любые),.....

Лучше использовать int (4 байта)

QUOTE
А теперь,считали в буфер

Зачем в буфер? Считали первые 4 байта, а потом, после проверки, столько, сколько в них и тд.

QUOTE
Получается надо в холостую просматривать всю структуру файл

Естественно проверка считаной информации на непротиворечивость ложится на ваши плечи smile.gif

QUOTE
По поводу записи: тоже я знаю что надо писать,всяких данных навернутых.Но сперва нужно ведь выделить памяти,а сколько — что тоже в холостую проходить цепочку по всем данным,подсчитывать объем,и уже по второму разу писать?

Непонял ohmy.gif данные уже в памяти или как? Нет таких объектов, для которых неопределен размер. Дык и писать-то можно последовательно.
olegenty
Отправлено: 26.11.2004, 13:40


Ветеран

Группа: Модератор
Сообщений: 2412



1. ну, чтоб не в холостую, храни CRС в начале файла например, — сразу будешь знать, битый, или нет. (ещё лучше — хеш)
2. создай индексный файл, где каждому элементу твоего файла данных соответствует его позиция. бонус: если при доступе по позиции ты получаешь нечто неожиданное (нет маркера начала записи) — файл битый (либо индекс битый, но это я не рассматриваю)
3. при наличии прочих правил, этого должно быть достаточно.

помню, как я с этим парился, делая курсовую на заказ (лет 6 назад). начал работать с iostream, а эта тварь с unsigned char не умела (и щас не умеет) работать. пришлось в срочном порядке делать маркеры из двух символов, которые с гарантией встретиться не могут. ох и муторно было, если учесть, что друг мне это сплавил за день до сдачи (сам не успевал написать), а в ночь перед сдачей мы с другим другом плотно отмечали его ДР и разошлись часа в 3 (имея немалое число литров пива в середине)

если не критично делать/не делать работу руками, воспользуйся любым плоским форматьм, типа DBF, функций и классов по работе с ними в природе существует так моного, что я даже боюсь предположить, сколько именно.
Schumi
Отправлено: 26.11.2004, 18:31


Машинист паровоза

Группа: Участник
Сообщений: 206



QUOTE
Лучше использовать int (4 байта)

А всегда ли int 4 байта?
QUOTE
1. ну, чтоб не в холостую, храни CRС в начале файла например, — сразу будешь знать, битый, или нет. (ещё лучше — хеш)

Что такое хеш?

По поводу записи: я сейчас как делаю. Беру создаю буфер,в него строчу данные,а потом скидываю в файл.Но можно сразу писать в файл последовательно нужную информацию,хотя не получится ли медленне.
И какой способ наиболее эффективный (в смысле используемых средств)?
AVC
Отправлено: 26.11.2004, 18:42


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
А всегда ли int 4 байта?

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

Отредактировано AVC — 26/11/2004, 18:46
Konstantine
Отправлено: 29.11.2004, 10:07


Мастер участка

Группа: Модератор
Сообщений: 545



если прога скомпилилась, то у неё размер инта не меняется... если нада две проги, то компиль одновременно с одинаковыми установками компилятора
Boyko
Отправлено: 01.12.2004, 12:18


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Schumi @ 26/11/2004, 18:33)
Что такое хеш?


Надо по форум поискать. biggrin.gif

Вернуться в Вопросы программирования в C++Builder