Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: 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 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
6-1113306725
zorik
2005-04-12 15:52
2005.07.18
cgi-приложение


14-1119715087
GEEK
2005-06-25 19:58
2005.07.18
Версии


14-1119768113
Viktop
2005-06-26 10:41
2005.07.18
Халявные FTP


1-1120032563
mefres
2005-06-29 12:09
2005.07.18
перевод числовых денег в строковые


10-1096259081
saysu
2004-09-27 08:24
2005.07.18
Какая технология лучше для построения многозвенки