Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема со считыванием текста
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
AlienEmperor
Возникла проблема, совсем не понимаю - откуда ?
Суть:

Код


Procedure read....
Var F:File;
     L:Integer;
     Txt:PChar;
....

begin
BlockRead(F,L,SizeOf(Integer));
ShowMessage(IntToStr(L)); // должно быть L=10, так и есть, считывает OK

GetMem(Txt,L);
BlockRead(F,Txt^,L);
// вот здесь он считывает 17 - 20 байтов (видимо, по настроению), вместо L=10 !!!
.... далее - неправильное считывание, crush and so on... :(
FreeMem(Txt,L);
End;



Если вручную поставить BlockRead(F,Txt^,7), то считывает текст не полностью (т.е. 7 символов вместо 10 - логично, а вот если поставить 8 - то уже глючит точно также)

Кто нибудь может сказать в чем здесь дело ???
hiv
У тебя перед BlockRead стоит Reset(F, 1) ?
AlienEmperor
2 hiv: угу...

Причем, я уже проверял: запись проходит корректно... По FilePos смотрел - тоже все ОК - перед самым считыванием строки стоит на 10 байтов до конца файла... После считывания - в самом конце файла...

я медленно начинаю шизеть.... sad.gif
hiv
Версии ОС и Делфи в студию!
xds
Добавь нулевой байт в конец строки:
Код

...
GetMem(Txt, L + 1);
BlockRead(F, Txt^, L);
Txt[L] := #0;
...
FreeMem(Txt);
...
AlienEmperor
Значит так: OS: Windows 98 SE2
Delphi 5 Enterprise

процедура (полная версия) (с записью все ОК):

Код

Procedure TBase.LoadFromFile(FileName:String);
Var I:Word;
    NumOfRecords:Word;
    F:File;
    Info:TInfo;
    Txt:PChar;
    L:Integer;
 Begin
 If Not(FileExists(FileName)) Then Begin
 ShowMessage('Файл '+FileName+'не существует!');
 Exit;
                                   End;
 If Data.Count>0 Then
 For I:=0 To Data.Count-1 Do
 Begin
 CurrentData:=Data[I];
 CurrentData.PicStorage.Destroy;
 Dispose(CurrentData);
 End;
  Data.Free;
  Data:=TList.Create;

 AssignFile(F,FileName);
 ReSet(F,1);
 BlockRead(F,NumOfRecords,SizeOf(Word));

 If NumOfRecords = 0 Then Begin
 CloseFile(F);
 ShowMessage('Нет записей!');
 Exit;
                          End;
   
 For I:=0 To NumOfRecords-1 Do
 Begin
  BlockRead(F,Info,SizeOf(TInfo));
  BlockRead(F,L,SizeOf(Integer));
  ShowMessage('L= '+IntToStr(L));
  GetMem(Txt,L);
  ShowMessage('FilePos(F) = '+IntToStr(FilePos(F)));
  BlockRead(F,Txt^,L);
  ShowMessage('FilePos(F) (after read) = '+IntToStr(FilePos(F)));
  ShowMessage('Length(Txt) = '+IntToStr(Length(Txt)));
  ShowMessage(' Txt = '+Txt);
  AddRec;
  SetInfo(I,Info);
  SetText(I,Txt);
  CurrentData:=Data.Items[I];
  CurrentData.PicStorage.LoadFromFile(ExtractFilePath(FileName)+
  CurrentData.Info.PicFile);
  FreeMem(Txt,L);
 End;
 CloseFile(F);
 CurrentRecNum:=0;
  CurrentData:=Data.Items[0];
  Assigned:=True;
  Changed:=False;
 End;
AlienEmperor
Точно! Блин... Это же PChar !!!
YES !!!
Все, спасибо, xds !!! Теперь все встало на свои места... СПАСИБО, а то я уже офигел смотреть на одно и то же...

smile.gif
smile.gif
smile.gif
xds
Можно было ещё так:
Код


var
 Txt: String;

....
SetLength(Txt, L);
BlockRead(F, Txt[1], L);
...

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.