Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизКонвертация Найти похожие ветки
← →
webpauk (2005-06-25 18:29) [0]Происходит ошибка при конвертации String в Pchar (нечитаемые символы).
Преобразование идет сначала из String в Pchar (напримерPchar(MyString)
, потом информация записывается в файл, а потом читается.
Я чего-то не так делаю?
← →
begin...end © (2005-06-25 18:43) [1]> webpauk (25.06.05 18:29)
> Я чего-то не так делаю?
Если получается не то, что хотелось бы -- вероятно, Вы действительно что-то не так делаете.
Что именно не так -- сказать сейчас вряд ли возможно, т.к. неизвестно, КАК именно Вы это делаете.
← →
webpauk (2005-06-25 18:51) [2]
> 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;
← →
Reindeer Moss Eater © (2005-06-25 18:57) [3]Ты все правильно делаешь.
Аккуратно записываешь в файл записи с указателями на строки.
Сами строки при этом ни в какой файл не попадают.
Неужели не хватило любопытства заглянуть внутрь файла?
← →
begin...end © (2005-06-25 19:01) [4]> webpauk (25.06.05 18:51) [2]
Вот теперь всё стало совершенно ясно. Поле Name в записи типа fFile представляет собой указатель на область памяти, в которой расположено тело строки (с нулевым завершающим символом). Поэтому получается, что в файл записывается не сама строка, а только указатель на неё. При следующем запуске программы и чтении записей из файла значения этих указателей считываются, но они уже неактуальны -- в памяти по этим адресам может находиться всё что угодно. И вот это "всё что угодно" (до первого встретившегося нулевого символа) Вы и видите.
← →
webpauk (2005-06-25 19:02) [5]> Reindeer Moss Eater ©
скажи тогда как запихнуть в файл строковую константу, потому как FF: TextFile - не подходит, аfFile: packed record
- разумеется выдает ошибку
Name: String;
Kol: Integer;
endl
← →
jack128 © (2005-06-25 19:05) [6]Либюо использовать нетизированные файлы и писать в них строки вот так:
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 байт..
← →
Reindeer Moss Eater © (2005-06-25 19:06) [7]fFile: packed record
Name: ShortString;
Kol: Integer;
endж
← →
jack128 © (2005-06-25 19:07) [8]jack128 © (25.06.05 19:05) [6]
При этом если реальная длина строки < N
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c