![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конвертация [D6, WinXP]
webpauk © (2005-06-25 18:29:00)Происходит ошибка при конвертации String в Pchar (нечитаемые символы).
Преобразование идет сначала из String в Pchar (напримерPchar(MyString), потом информация записывается в файл, а потом читается.
Я чего-то не так делаю?
jack128 (2005-06-25 19:07:00) [1]jack128 © (25.06.05 19:05) [6]
При этом еслиреальная длина строки < N
Reindeer Moss Eater (2005-06-25 19:06:00) [2]fFile: packed record
Name: ShortString;
Kol: Integer;
endж
jack128 (2005-06-25 19:05:00) [3]Либюо использовать нетизированные файлы и писать в них строки вот так:
procedure BlockWriteString(var f: file; const s: string);
var
Len: Integer;
begin
Len := Length(s);
BlockWrite(f, Len, SizeOf(Len));
if Len > 0 then
BlockWrite(f, s[1], Len);
end;
procedure BlockReadString(var f: file; out s: string);
var
Len: Integer;
begin
BlockRead(f, Len, SizeOf(Len));
SetLength(s, Len);
if Len > 0 then
BlockRead(f, s[1], Len);
end;
либо объявить записть таким образом
webpauk (25.06.05 19:02) [5]
fFile: packed record
Name: String[N];
Kol: Integer;
endl
Где N - максимально возможное число символов в строке. Но N должно быть <= 255 При этом есть реальная длина строки < N, то в фал запишится все равно N + 1 байт..
webpauk (2005-06-25 19:02:00) [4]> Reindeer Moss Eater ©
скажи тогда как запихнуть в файл строковую константу, потому как FF: TextFile - не подходит, а
fFile: packed record- разумеется выдает ошибку
Name: String;
Kol: Integer;
endl
begin...end (2005-06-25 19:01:00) [5]> webpauk (25.06.05 18:51) [2]
Вот теперь всё стало совершенно ясно. Поле Name в записи типа fFile представляет собой указатель на область памяти, в которой расположено тело строки (с нулевым завершающим символом). Поэтому получается, что в файл записывается не сама строка, а только указатель на неё. При следующем запуске программы и чтении записей из файла значения этих указателей считываются, но они уже неактуальны -- в памяти по этим адресам может находиться всё что угодно. И вот это "всё что угодно" (до первого встретившегося нулевого символа) Вы и видите.
Reindeer Moss Eater (2005-06-25 18:57:00) [6]Ты все правильно делаешь.
Аккуратно записываешь в файл записи с указателями на строки.
Сами строки при этом ни в какой файл не попадают.
Неужели не хватило любопытства заглянуть внутрь файла?
webpauk (2005-06-25 18:51:00) [7]
> begin...end ©
Type
fFile: packed record
Name: Pchar;
Kol: Integer;
endl
procedure Close;
var
myFile: fFile;
ff: file of fFile;
myString: String;
begin
myFile.Name:=Pchar(MyString);
myFile.Kol:=100;
AssignFile(ff, 'FF.prp');
Rewrite(ff);
Write(ff, myFile);
CloseFile(ff);
end;
...............
procedure Open;
var
myFile: fFile;
ff: file of fFile;
myString: String;
begin
AssignFile(ff, 'FF.prp');
if FileExists('FF.prp') then
begin
Reset(ff);
while not EOF(ff) do
Read(ff, myFile);
end
else
begin
Rewrite(ff);
Write(ff, myFile);
end;
CloseFile(ff);
myString:=myFile.Name;
end;
begin...end (2005-06-25 18:43:00) [8]> webpauk (25.06.05 18:29)
> Я чего-то не так делаю?
Если получается не то, что хотелось бы -- вероятно, Вы действительно что-то не так делаете.
Что именно не так -- сказать сейчас вряд ли возможно, т.к. неизвестно, КАК именно Вы это делаете.