Вниз
Скачать: CL | DM;

Конвертация   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.024 c
8-1111232748
X-Disa
2005-03-19 14:45
2005.07.18
Текст на канвасе


3-1118267577
highlander
2005-06-09 01:52
2005.07.18
Работа с БД Firebird, Interbase в Делфи


4-1116683520
BoAlSe
2005-05-21 17:52
2005.07.18
Список всех видеорежимов...


5-1090683370
Yaral
2004-07-24 19:36
2005.07.18
Наследование форм


3-1118233992
Kirill_21
2005-06-08 16:33
2005.07.18
Добавление данных в DB




   Наверх