Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

Что за символы на конце строки и откуда берутся?   Найти похожие ветки 

 
chai   (2006-06-03 00:17) [0]

Есть нетипизированный файл, в котором данные хранятся в формате длина_строки_строка_ и т.д
После чтения в конце строки от случая к случаю от 1 до 3 лишних символов.
И вообще не понятно откуда они там берутся, если под буфер выделяется память = размеру строки.  
Как избавиться от этих символов?

// код без отлова ошибок
// эта процедура читает строки
procedure TForm1.Button1Click(Sender: TObject);
var
 F: File;
 Buffer: Pointer; // c PChar и дин. массивами array of Char таже история
 sz: Integer;
begin
 AssignFile(F,"c:\abc.dat");
 Reset(F,1);
 while not EOF(F) do
 begin
   BlockRead(F,sz,SizeOf(sz));
   GetMem(Buffer,sz);
   BlockRead(F,Buffer^,sz);
   MessageBox(Handle,@Buffer^,"abc string",0); // на конце строки переодически появляется мусор
   FreeMem(Buffer);
 end;
 CloseFile(F);
end;
// эта записывает
procedure TForm1.Button2Click(Sender: TObject);
var
 F: File;
 S: String;
 sz: Integer;
begin
 AssignFile(F,"c:\abc.dat");
 if FileExists("c:\abc.dat") then
 begin
   Reset(F,1);
   Seek(F,FileSize(F));
 end else
   Rewrite(F,1);
 S := Edit1.Text;
 sz := Length(S);
 BlockWrite(F,sz,SizeOf(sz));
 BlockWrite(F,PChar(S)^,sz);
 CloseFile(F);

end;

Спасибо.


 
palva ©   (2006-06-03 00:59) [1]

MessageBox ловит конец строки по нулевому символу. Так что нужно выделяя память под строку выделить на один символ больше и в последний символ загнать Chr(0), чтобы он отсекал мусор.


 
chai   (2006-06-03 01:29) [2]

Сделал как вы сказали, но мусор не исчез:

var
F: File;
Buffer: PChar;
sz: Integer;
begin
AssignFile(F,"c:\abc.dat");
Reset(F,1);
while not EOF(F) do
begin
  BlockRead(F,sz,SizeOf(sz));
  Inc(sz);
  GetMem(Buffer,sz);
  BlockRead(F,Buffer^,sz -1);
  Buffer[sz] := Chr(0);
  MessageBox(Handle,@Buffer^,"abc string",0);
  FreeMem(Buffer);
end;


 
Loginov Dmitry ©   (2006-06-03 09:29) [3]

Скопировал. Проверил.
Мусора нет.
Так что проверьте еще раз.


 
palva ©   (2006-06-03 09:49) [4]

А может быть длина строки включает в себя те 4 байта, которые занимает запись длины? Надо остановиться на мусоре в отладчике и посмотреть переменные.


 
chai   (2006-06-03 11:04) [5]

Проверил, мусор исчезает, если использовать дин. массивы типа Char с длиной на единицу больше строки. Причем Chr(0) необязательно помещать в последний элемент...
Буду использовать массивы. Все спасибо за ответы.



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.053 c
3-1145378453
linx
2006-04-18 20:40
2006.06.18
"cannot attach to password database"


2-1148893538
Mozgan
2006-05-29 13:05
2006.06.18
Защита файла от удаления


11-1128965722
Riton
2005-10-10 21:35
2006.06.18
TKOLTreeview - item reaching


2-1148888726
Ironman83
2006-05-29 11:45
2006.06.18
dxTreeList


2-1149175295
Asail
2006-06-01 19:21
2006.06.18
Как скопировать контрол в другой parent?