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

Вниз

Работа с файлами   Найти похожие ветки 

 
GlebKl ©   (2006-06-16 00:43) [0]

Нашел описание нужного мне типа файла:

PDT:                                                        
Вначале файла всегда находится текст "JTV 3.x TV Program Data" за ним три символа с кодом 0Ah, дальше, начиная со смещения 01Ah повторяются записи
переменной длины:
* 2 байта на количество символов в названии
* Hазвание телепередачи

Мне нужно всего лишь считать всю информацию из этого файла.
Пожалуйста, скажите, каким образом это возможно?


 
GlebKl ©   (2006-06-16 02:39) [1]

Все, что у меня получилось - прога считала символ "J" и записала его в buf в виде цифры. Возможно ли считать сразу 26 символов и записать их в "s:string" ?


 
Cashmare ©   (2006-06-16 02:45) [2]

Ну, объяви file of byte и делай с ним, что хочешь...
Еще цикл поможет :) А внутри s:=s+...


 
Loginov Dmitry ©   (2006-06-16 10:19) [3]

GlebKl ©   (16.06.06 2:39) [1]
Возможно ли считать сразу 26 символов и записать их в "s:string"


Конечно!


 
tesseract ©   (2006-06-16 10:25) [4]


>  Возможно ли считать сразу 26 символов и записать их в "s:
> string" ?

С диска меншьше 4 кб не считашь - ОС минимум по 4кб читает.


 
Loginov Dmitry ©   (2006-06-16 10:29) [5]

Но ведь можно использовать потоки TStream. А там все просто:

SetLength(S, 26);
TStream.Read(PChar(S)^, 26);

Так примерно :)


 
GlebKl ©   (2006-06-16 13:45) [6]

Ребята, спасибо! Работать с файлами вроде научился. Почти. :)  Возникает непонятная ошибка "Project Project1.exe raised exception class EAccessViolation with message "Access violation at address EFEEF2F1. Read of address EFEEF2F1". Process stopped. Use Step or Run to continue." при выполнении следующей процедуры:


...
var    fPdt,fNdx:file;
buf,buf2,j:integer;
...
procedure TForm1.FileListBox1Click(Sender: TObject);
var strPdt:string;
s1,s2,s3:string;
q,i,Colvo_Zapisey:integer;
ckl:filetime;
ckl1:systemtime;
begin

  strPdt:=copy(FileListBox1.FileName,0,pos(".",FileListBox1.FileName))+"pdt";
  assignfile(fNdx,FileListBox1.FileName);
  assignfile(fPdt,strPdt);
  reset(fNdx,1);
  blockread(fNdx,buf,2);
  Colvo_Zapisey:=buf;
for i:=1 to Colvo_Zapisey do begin
 blockread(fNdx,buf,2);
 blockread(fNdx,ckl,8);
 FileTimeToSystemTime(ckl,ckl1);
 s2:="";
 s2:= inttostr(ckl1.wHour)+":"+inttostr(ckl1.wMinute);
 blockread(fNdx,buf,2);
 reset(fPdt,1);
 blockread(fPdt,buf2,buf);
 blockread(fPdt,buf,2);
 s3:="";
 if eof(fPdt) then exit;
 for j:=1 to buf do begin
     blockread(fPdt,buf2,1);
     s3:=s3+chr(buf2);
 end;
   closefile(fPdt);
 if ckl1.wDayOfWeek = 1 then begin
  StringGrid1.Cells[0,i-1]:=s2;
  StringGrid1.Cells[1,i-1]:=s3;
 end;
end;
end;


Кто виноват? Что делать?


 
GlebKl ©   (2006-06-16 14:30) [7]

забыл сказать: NDX:
первые два байта в файле - количество записей, дальше идут записи, каждая размером 12 байт:
* первые 2 байта в записи всегда равны 0
* восемь байт структуры FILETIME (дата и время начала телепередачи)
* два байта - смещение-указатель в файле PDT на количество символов в названии телепередачи.

Фишка в том, что прога должна прочитать программу на понедельник и вывести ее в StringGrid1.


 
medved_68 ©   (2006-06-16 15:11) [8]

А нафига используешь BlockRead??? Зачем так сложно???
Создай из FileListBox имя файла с полным путем к нему и используй:

var
potok:TFileStream;
begin
Potok:=TFileStream.Create(Имя файла,fmOpenRead);
...и копируй все что надо из потока куда надо методами
Potok.Read или Potok.ReadBuffer
по окончанию работы
Potok.Free
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.06 c
2-1149764652
Megabyte
2006-06-08 15:04
2006.07.02
Программное создание пользователя в MSSQL


15-1149551726
Nevilon
2006-06-06 03:55
2006.07.02
Потестите, плиз, прогу


2-1150399200
Zloi-avgust
2006-06-15 23:20
2006.07.02
скачать файл по HTTP зная PI (при условии что нет домена)


15-1149525088
Alien1769
2006-06-05 20:31
2006.07.02
Еще про старые ПК


6-1133100822
SergProger
2005-11-27 17:13
2006.07.02
Установить соединение с инетом