![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В цикле последовательно обратиться к полям записи.
AlexanderMS © (2007-12-26 16:03:00)Скажите, пожалуйста, как в цикле последовательно обратиться к полям записи, зная их размер?
Есть переменная типа record. Необходимо в цикле последовательно прочитать из текстового файла значения полей (каждой поле - 1 байт). То есть не так (var F: TextFile):
Readln(F, S);
MyRec.Field1 := strtoint(S);
Readln(F, S);
MyRec.Field2 := strtoint(S);
Readln(F, S);
MyRec.Field3 := strtoint(S);
...
А вот так:
for Line := 0 to RecCount - 1 do
begin
Readln(F, S);
// MyRec.Fields[Line] := strtoint(S); тут нужен трюк
end;
Как можно осуществить сабж?
Sapersky (2007-12-26 18:12:00) [1]немножко будет, в случае array of MyRec
Finally, the compiler rounds the total size of the record upward to the byte boundary specified by the largest alignment of any of the fields.
В данном случае это 1 байт, т.е. размер округляться не будет.
Anatoly Podgoretsky (2007-12-26 17:24:00) [2]> Сергей М. (26.12.2007 17:07:28) [28]
> Это на случай потенциального overflow
Тогда опять программа неправильная и лучше получить сообщение об ошибке, чем неправильные данные и спрятаная ошибка.
Anatoly Podgoretsky (2007-12-26 17:23:00) [3]> Сергей М. (26.12.2007 16:43:19) [19]
Если не очевидно, то тогда программа полностью не работоспособная, смотри StrToInt(S)
Anatoly Podgoretsky (2007-12-26 17:21:00) [4]> AlexanderMS (26.12.2007 16:39:14) [14]
Тебе нужен массив, а не запись.
И strtoint лишнее для Readln
Palladin (2007-12-26 17:14:00) [5]немножко будет, в случае array of MyRec
Sapersky (2007-12-26 17:08:00) [6]Но при обязательном packed)
В данном конкретном случае - не обязательно... хотя и вреда от него не будет.
Сергей М. (2007-12-26 17:07:00) [7]
> Palladin © (26.12.07 17:01) [27]
Не суть как важно)
Это на случай потенциального overflow)
Palladin (2007-12-26 17:01:00) [8]
> Byte(IntToStr(S));
так, ведь, приведение не обязательно, компилятор справится сам с этой задачей.. или я не прав? :)
Сергей М. (2007-12-26 17:00:00) [9]
> SizeOf(MyRec)-0
SizeOf(MyRec)- 1
Сергей М. (2007-12-26 16:59:00) [10]
> Ну тады наверно так:
Но при обязательном packed)
Сергей М. (2007-12-26 16:57:00) [11]Ну тады наверно так:
for i := 0 to SizeOf(MyRec)-0 do begin
Readln(F, S);
PByteArray(@MyRec)[i] := Byte(IntToStr(S));
end;
Palladin (2007-12-26 16:54:00) [12]ну млин :) прошу прощения, написал не то, что имел в виду
одна строчка - одно числеко
Сергей М. (2007-12-26 16:51:00) [13]
> Palladin © (26.12.07 16:47) [21]
Не-а.
Известно только, что файл текстовый.
Т.е. вида
154
1
0
66
255
33
Каждая строка в файле, возможно, имеет переменное число десятичных цифровых символов, а не "одна строчка - одна циферка"
Palladin (2007-12-26 16:47:00) [14]
> [19] Сергей М. © (26.12.07 16:43)
ну как не очевидно, а:
Readln(F, S);
MyRec.Field1 := strtoint(S);
Readln(F, S);
MyRec.Field2 := strtoint(S);
Readln(F, S);
MyRec.Field3 := strtoint(S);
разве не говорит об ожидаемом четком формате файла?
Palladin (2007-12-26 16:44:00) [15]короче :)
если прямо уж так хочется обратиться к записи как к массиву однородных значений, то можно попробовать ректальный метод
Type
TMyRec=Packed Record
f1,f2,f3,f4,f5,f6:Byte;
End;
Var
r:TMyRec;
a:Array [1..6] of Byte absolute r;
s:String;
function readlnn:byte;
Begin
Readln(f,s);
Result:=StrToInt(s);
End;
for i:=1 to 6 do a[i]:=readlnn;
Сергей М. (2007-12-26 16:43:00) [16]
> Palladin © (26.12.07 16:41) [16]
> на одну строчку - одна циферка
>
Вовсе не очевидно.
Anatoly Podgoretsky (2007-12-26 16:42:00) [17]Просто для примера - надо приводить правильные примеры и писать что хочешь сделать, а не как и какие у тебя данные.
Поскольку обсуждать бред нет смысла, давай нормальную постановку.
AlexanderMS (2007-12-26 16:42:00) [18]
> Спасибо, вроде неплохой вариант.
То есть спасибо большое, то что надо!
Palladin (2007-12-26 16:41:00) [19]
> [13] Сергей М. © (26.12.07 16:36)
да почему перменной длинны, судя, опять же по первому посту, у него там циферки :) на одну строчку - одна циферка
AlexanderMS (2007-12-26 16:40:00) [20]
> Sapersky (26.12.07 16:34) [12]
Спасибо, вроде неплохой вариант.