Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
3-1118305231
sasa2001
2005-06-09 12:20
2005.07.18
Как лучше организовать обновление изменений в базе?


1-1120128240
Cat
2005-06-30 14:44
2005.07.18
Динамический массив


3-1117704486
Kerim_
2005-06-02 13:28
2005.07.18
ADO - удаление записей из связанных таблиц


14-1119364741
NW
2005-06-21 18:39
2005.07.18
Info Setup


1-1120366420
Revers
2005-07-03 08:53
2005.07.18
Команды меню Edit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский