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 | Получается надо в холостую просматривать всю структуру файл |
Естественно проверка считаной информации на непротиворечивость ложится на ваши плечи
QUOTE | По поводу записи: тоже я знаю что надо писать,всяких данных навернутых.Но сперва нужно ведь выделить памяти,а сколько — что тоже в холостую проходить цепочку по всем данным,подсчитывать объем,и уже по второму разу писать? |
Непонял данные уже в памяти или как? Нет таких объектов, для которых неопределен размер. Дык и писать-то можно последовательно. |
|
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) | Что такое хеш?
|
Надо по форум поискать. |
|
|