IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Проблема со считыванием текста
AlienEmperor
сообщение 23.11.2005 14:40
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 160
Пол: Мужской
Реальное имя: Серый

Репутация: -  0  +


Возникла проблема, совсем не понимаю - откуда ?
Суть:

Код


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 - то уже глючит точно также)

Кто нибудь может сказать в чем здесь дело ???


--------------------
Все в жизни ботва... Кроме пчел!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 23.11.2005 15:03
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


У тебя перед BlockRead стоит Reset(F, 1) ?


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlienEmperor
сообщение 23.11.2005 15:07
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 160
Пол: Мужской
Реальное имя: Серый

Репутация: -  0  +


2 hiv: угу...

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

я медленно начинаю шизеть.... sad.gif


--------------------
Все в жизни ботва... Кроме пчел!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 23.11.2005 15:21
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Версии ОС и Делфи в студию!


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.11.2005 15:27
Сообщение #5


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Добавь нулевой байт в конец строки:
Код

...
GetMem(Txt, L + 1);
BlockRead(F, Txt^, L);
Txt[L] := #0;
...
FreeMem(Txt);
...


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlienEmperor
сообщение 23.11.2005 15:28
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 160
Пол: Мужской
Реальное имя: Серый

Репутация: -  0  +


Значит так: 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;


--------------------
Все в жизни ботва... Кроме пчел!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlienEmperor
сообщение 23.11.2005 15:32
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 160
Пол: Мужской
Реальное имя: Серый

Репутация: -  0  +


Точно! Блин... Это же PChar !!!
YES !!!
Все, спасибо, xds !!! Теперь все встало на свои места... СПАСИБО, а то я уже офигел смотреть на одно и то же...

smile.gif
smile.gif
smile.gif


--------------------
Все в жизни ботва... Кроме пчел!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.11.2005 15:34
Сообщение #8


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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


var
 Txt: String;

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



--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 10.08.2025 2:44
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"