Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Внизмассив Найти похожие ветки
← →
XbI (2006-07-20 20:57) [0]есть такая проблема...
есть файл и нужно из файла считывать данные в массив, причем массив по размеру всегда разный...
Делаю так:var
Mas: array of Byte;
h: integer;
..........................
..........................
begin
..........................
SetLength(Mas,h); ?????????????
BlockRead(F,Mas,sizeof(Mas));
.........................
end;
это все выполняется в цикле...
при первом проходе все нормально, но когда второй раз проходит этот участок то на строке {????????????} возникает ошибка ввода-вывода, как это можно исправить, не подскажете? как еще можно задавать размер массива?
← →
Джо © (2006-07-20 21:00) [1]Не мешало бы, я думаю, увидеть более полный код.
← →
begin...end © (2006-07-20 21:07) [2]> XbI (20.07.06 20:57) [0]
На первом проходе у Вас затирается ссылка на тело динамического массива, поэтому в следующий раз в SetLength передаётся испорченная ссылка.
Строку с BlockRead, вероятно, следует записать так:BlockRead(F, Mas[0], Length(Mas))
.
← →
XbI (2006-07-20 21:13) [3]
> Строку с BlockRead, вероятно, следует записать так: BlockRead(F,
> Mas[0], Length(Mas)).
если я так сделаю, то он в первый элемент(в 1 байт) запишет эту информацию, а мне нужно заполнить всю структуру и дальше уже с ней работать, или это не так(нету сейчас возможности проверить это)?
> На первом проходе у Вас затирается ссылка на тело динамического
> массива, поэтому в следующий раз в SetLength передаётся
> испорченная ссылка.
а как это исправить, не подскажете?
> Не мешало бы, я думаю, увидеть более полный код.
там нет ничего интересного, там идет обработка этих данных...
← →
Мефисто (2006-07-20 21:21) [4]
> там нет ничего интересного, там идет обработка этих данных.
> ..
Отвечающим вообщето вообще фиолетого :)
> а мне нужно заполнить всю структуру и дальше уже с ней
> работать,
Дан ответ в:
> begin...end © (20.07.06 21:07) [2]
← →
Мефисто (2006-07-20 21:24) [5]
> begin...end © (20.07.06 21:07) [2]
> BlockRead(F, Mas[0], Length(Mas)).
Небольшая поправка :)
Скорее всего так: Length(Mas) * SizeOf(TMyRecord)
← →
begin...end © (2006-07-20 21:27) [6]> XbI (20.07.06 21:13) [3]
> если я так сделаю, то он в первый элемент(в 1 байт) запишет
> эту информацию...
> ...или это не так(нету сейчас возможности проверить это)?
Если Вы так сделаете, то в тело массива Mas запишется h = Length(Mas) байт информации из файла F (если, конечно, они там есть).
> а как это исправить, не подскажете?
Так, как написано в [1].
Дело вот в чём. В качестве параметра Buf процедуры BlockWrite нужно указывать переменную, по адресу которой нужно записать данные из файла. Переменная Mas представляет собой, фактически, указатель на тело динамического массива. Так вот -- если в качестве Buf передать Mas, то данные из файла запишутся в память туда, где расположена переменная Mas, т.е. в ссылку на массив, а не в его тело. Если же передать Mas[0], то запись будет по адресу элемента Mas[0], т.е. по адресу начала тела массива, и данные будут записаны в тело массива, что и требуется.
← →
begin...end © (2006-07-20 21:32) [7]> Мефисто (20.07.06 21:24) [5]
Сорри, но в [0] я вижу array of Byte, а не array of TMyRecord. Поэтому, вероятно, верен всё же мой вариант -- если, конечно, файл F быт открыт с размером блока в 1 байт, иначе вместоLength(Mas)
следует писатьLength(Mas) div {размер_блока}
.
← →
Джо © (2006-07-20 21:33) [8]Добавим сюда еще и "ошибку ввода/вывода" и усядемся гадать до утра :)
← →
Мефисто (2006-07-20 21:39) [9]
> begin...end © (20.07.06 21:32) [7]
Каюсь, недосмотрел. :( Все - ОК.
← →
XbI (2006-07-20 22:10) [10]открытие файла происходит так:
AssignFile(F,fn);
Reset(F,1);
Спасибо, за подробное объяснение!!!
завтра проверю, надеюсь все получится...
← →
Anatoly Podgoretsky © (2006-07-20 22:35) [11]begin...end © (20.07.06 21:32) [7]
Сорри, но в [0] я вижу array of Byte, а не array of TMyRecord.
А не важно, все равноLength(Mas) * SizeOf(Byte)
Сегодня байт, завтра Integer. Кстати примерно так же и оправдывали кодLength(Mas) * 2
Там же Integer
← →
StriderMan © (2006-07-20 23:06) [12]
> Length(Mas)
уже вернет количество элементов * размер элемента! Разве нет?
← →
Джо © (2006-07-20 23:11) [13]> [12] StriderMan © (20.07.06 23:06)
>
> > Length(Mas)
>
> уже вернет количество элементов * размер элемента! Разве
> нет?
Нет.
← →
Германн © (2006-07-21 02:12) [14]
> там нет ничего интересного, там идет обработка этих данных.
> ..
Ну это ты так считаешь. Или секретные сведения?
А я, лично, не понял в сабже вот это - есть файл и нужно из файла считывать данные в массив, причем массив по размеру всегда разный....
Имхо, очень много вариантов сабжа можно придумать на основе этой строки. Какой из них реально твой - непонятно. :-(
← →
Elen © (2006-07-21 08:11) [15]
> открытие файла происходит так:
> AssignFile(F,fn);
> Reset(F,1);
В каком месте ты открываеш файл?
> BlockRead(F,Mas,sizeof(Mas));
Если не ошибаюсь после этого ты попадаеш в конец файла и при повторном считывании прога обьявляет тебе о конце файла I/O Error. Нужно в этой процедуре поставить Reset
← →
Elen © (2006-07-21 08:12) [16]P.S.
> ошибка ввода-вывода
Разве ошибка Ввода/вывода возникает на SetLength? Помоему к этой ошибке должен относится BlockRead?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c