Текущий архив: 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.45 MB
Время: 0.01 c