Форум: "Начинающим";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
ВнизРабота с файлами Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.015 c