![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что за символы на конце строки и откуда берутся? [D7, XP]
chai © (2006-06-03 00:17:00)Есть нетипизированный файл, в котором данные хранятся в формате длина_строки_строка_ и т.д
После чтения в конце строки от случая к случаю от 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;
Спасибо.
chai (2006-06-03 11:04:00) [1]Проверил, мусор исчезает, если использовать дин. массивы типа Char с длиной на единицу больше строки. Причем Chr(0) необязательно помещать в последний элемент...
Буду использовать массивы. Все спасибо за ответы.
palva (2006-06-03 09:49:00) [2]А может быть длина строки включает в себя те 4 байта, которые занимает запись длины? Надо остановиться на мусоре в отладчике и посмотреть переменные.
Loginov Dmitry (2006-06-03 09:29:00) [3]Скопировал. Проверил.
Мусора нет.
Так что проверьте еще раз.
chai (2006-06-03 01:29:00) [4]Сделал как вы сказали, но мусор не исчез:
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;
palva (2006-06-03 00:59:00) [5]MessageBox ловит конец строки по нулевому символу. Так что нужно выделяя память под строку выделить на один символ больше и в последний символ загнать Chr(0), чтобы он отсекал мусор.