Модератор: Модераторы
bormant писал(а):Желательно привести тут декларацию TRec, sizeof(TRec) в программе на Delphi и FPC.
Часто подобные проблемы бывают вызваны разным выравниванием полей записи в памяти (у полей получаются разные смещения от начала записи).
http://www.freepascal.org/docs-html/pro ... 50001.1.60
Другой класс ошибок -- прямое чтение little-endian данных на big-endian или mid-endian платформах и наоборот.
type
TRec=record
rn:string[40];
dn:string[20];
nazv:string[200];
vid:string[200];
kontr:string[150];
krat:string[30];
tema:string[40];
fin:string[10];
end;
...
var
R:TRec;
V:File of TRec;
dog:array[1..10000,1..15] of string;
...
begin
...
read(V,R);
dog[step_txt,1]:=R.rn;
dog[step_txt,2]:=R.dn;
dog[step_txt,3]:=R.nazv;
dog[step_txt,4]:=R.vid;
dog[step_txt,5]:=R.kontr;
dog[step_txt,6]:=R.krat;
dog[step_txt,7]:=R.tema;
dog[step_txt,8]:='0';
type
TRec=record
rn: string[40];
dn: string[20];
nazv: string[200];
vid: string[200];
kontr: string[150];
krat: string[30];
tema: string[40];
fin: string[10];
end;
var
R: TRec;
F: file of TRec;
begin
with R do begin
rn := 'rn'; dn := 'dn'; nazv := 'nazv'; vid := 'vid';
kontr := 'kontr'; krat := 'krat'; tema := 'tema'; fin := 'fin';
end;
Assign(F, 'test.dat'); Rewrite(F);
Write(F, R); Write(F, R);
Close(F);
end.
$ echo -n 'абвгдежзийклмнопрстуфхцчшщъыьэюя' | iconv -t cp1251 | hexdump -C
00000000 e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef |................|
00000010 f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff |................|
00000020
$ echo -n 'абвгдежзийклмнопрстуфхцчшщъыьэюя' | iconv -t cp866 | hexdump -C
00000000 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af |................|
00000010 e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef |................|
00000020
$ echo -n 'абвгдежзийклмнопрстуфхцчшщъыьэюя' | iconv -t koi8-r | hexdump -C
00000000 c1 c2 d7 c7 c4 c5 d6 da c9 ca cb cc cd ce cf d0 |................|
00000010 d2 d3 d4 d5 c6 c8 c3 de db dd df d9 d8 dc c0 d1 |................|
00000020
$ echo -n 'абвгдежзийклмнопрстуфхцчшщъыьэюя' | iconv -t iso-8859-5 | hexdump -C
00000000 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df |................|
00000010 e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef |................|
00000020
$ echo -n 'абвгдежзийклмнопрстуфхцчшщъыьэюя' | iconv -t ucs2 | hexdump -C
00000000 30 04 31 04 32 04 33 04 34 04 35 04 36 04 37 04 |0.1.2.3.4.5.6.7.|
00000010 38 04 39 04 3a 04 3b 04 3c 04 3d 04 3e 04 3f 04 |8.9.:.;.<.=.>.?.|
00000020 40 04 41 04 42 04 43 04 44 04 45 04 46 04 47 04 |@.A.B.C.D.E.F.G.|
00000030 48 04 49 04 4a 04 4b 04 4c 04 4d 04 4e 04 4f 04 |H.I.J.K.L.M.N.O.|
00000040
$ echo -n 'абвгдежзийклмнопрстуфхцчшщъыьэюя' | iconv -t utf8 | hexdump -C
00000000 d0 b0 d0 b1 d0 b2 d0 b3 d0 b4 d0 b5 d0 b6 d0 b7 |................|
00000010 d0 b8 d0 b9 d0 ba d0 bb d0 bc d0 bd d0 be d0 bf |................|
00000020 d1 80 d1 81 d1 82 d1 83 d1 84 d1 85 d1 86 d1 87 |................|
00000030 d1 88 d1 89 d1 8a d1 8b d1 8c d1 8d d1 8e d1 8f |................|
00000040
Валентина писал(а):
- Код: Выделить всё
type
TRec=record
Это всего лишь один из возможных вариантов борьбы с неправильным выравниванием. Но есть и другие. И, скорее всего, в данном случае проблема не с выравниванием, а с кодировками.Vapaamies писал(а):должны объявляться как packed record
TRec=record
rn: string[40];
dn: string[20];
nazv: string[200];
vid: string[200];
kontr: string[150];
krat: string[30];
tema: string[40];
fin: string[10];
end;
var
R: TRec;
...
FillChar(R, SizeOf(R), #0);
R.rn := '113-11А';
R.dn := '01.02.2011';
...
Write(F, R);
type ...
var
R: TRec;
F: file of TRec;
begin
Assign(F, 'file.dat'); Reset(F);
while not EOF(F) do with R do begin
Read(R);
WriteLn(rn);
WriteLn(dn);
...
end;
Close(F);
end.
type
TRec=record
rn: string[40];
dn: string[20];
nazv: string[200];
vid: string[200];
kontr: string[150];
krat: string[30];
tema: string[40];
fin: string[10];
end;
var
R, R2: TRec;
F, F2: file of TRec;
begin
Assign(F, 'file.dat'); Reset(F);
Assign(F2, 'copy.dat'); Rewrite(F2);
while not EOF(F) do with R2 do begin
Read(F, R);
FillChar(R2, SizeOf(R2), #0);
rn := R.rn;
dn := R.dn;
nazv := R.nazv;
vid := R.vid;
kontr := R.contr;
krat := R.krat;
tema := R.tema;
fin := R.fin;
Write(F2, R2);
end;
Close(F2); Close(F);
end.
rn:113-11А
dn:01.02.2011
nazv:Договор на поставку тепловой энергии
vid:Поставка тепловой энергии
kontr:ОАО "Саратовэнерго"
krat:Саратов
tema:Оказание услуг
fin:расходный
type
TRec=record
rn: string[40];
dn: string[20];
nazv: string[200];
vid: string[200];
kontr: string[150];
krat: string[30];
tema: string[40];
fin: string[10];
end;
function Str2Utf8(S: String): string;
type
str3: string[3];
function Char1251toUtf8(C: Char): str3; inline;
begin
case Byte(C) of
192..239: Char1251toUtf8 := #208 + Char(Byte(C) - 48);
240..255: Char1251toUtf8 := #209 + Char(Byte(C) - 112);
else Char1251toUtf8 := C;
end;
end;
var
i: Integer;
r: String;
begin
r := '';
for i := 1 to Length(S) do
r := r + Char1251toUtf8(S[i]);
Str2Utf8 := r;
end;
var
R: TRec;
F: file of TRec;
procedure DumpRecInUtf8(const R: TRec);
begin
WriteLn('rn:':6, Str2Utf8(rn));
WriteLn('dn:':6, Str2Utf8(dn));
WriteLn('nazv:':6, Str2Utf8(nazv));
WriteLn('vid:':6, Str2Utf8(vid));
WriteLn('kontr:':6, Str2Utf8(kontr));
WriteLn('krat:':6, Str2Utf8(krat));
WriteLn('tema:':6, Str2Utf8(tema));
WriteLn('fin:':6, Str2Utf8(fin));
WriteLn;
end;
begin
Assign(F, 'dog1251.dat'); Reset(F);
while not EOF(F) do begin
Read(F, R);
DumpRecInUtf8(R);
end;
Close(F);
end.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 226