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

Вниз

ERROR_INVALID_HANDLE   Найти похожие ветки 

 
Schummi   (2004-05-30 18:29) [0]

Мастера, подскажите избавиться от ошибки I/O 6 Она означает ERROR_INVALID_HANDLE Возникает она вот как:

f:textfile;

while not eof(f) do
begin
 readln(f,st);
 try
  ... //действия с st, возникает ошибка EAccessViolation
 except
 ... //обработка ошибки
 end;
end;
и потом на строке readln(f,st); возникает I/O 6
Почему???


 
Gero ©   (2004-05-30 18:34) [1]

Потому что сначала файл нужно открыть для чтения. И assign сделать.
AssignFile(F, "c:\1.txt");
Reset(F);


 
Schummi   (2004-05-30 19:08) [2]

ну да, да все я это сначало делаю. просто не писал, чтобы указать на более важное


 
Gero ©   (2004-05-30 19:16) [3]

То, что иногда считают не важным, может оказаться очень даже важным.
И хотелось бы увидеть весь код.
Кстати, для текстовых файлов применяется не eof, а seekeof.


 
Kair ©   (2004-05-30 19:20) [4]

>Gero ©   (30.05.04 19:16) [3]
>Кстати, для текстовых файлов применяется не eof, а seekeof.

Да нет же, все-таки EOF();


 
Gero ©   (2004-05-30 19:23) [5]


> Да нет же, все-таки EOF();

Да, Eof тоже можно.


 
Schummi   (2004-05-30 19:41) [6]

ok
Есть строка :
     CALL DISP:  03  31  00A  0  00000000  00  5011  788480;
ее обраб нормально, а вот
     CALL DISP:  02  0E   016  2367033  2D35000B  16  5011  785850;
уже облом. Этот облом ликвидируется в except, а вот с указателем на файл - облом!

Status.Panels.Items[0].PanelType:=sptGauge;
Status.Panels.Items[0].GaugeAttrs.Position:=0;
AssignFile(f,fn);
Reset(f);
Ln:=FileSize(f);
while not eof(f) do
 begin
  readln(f,st);
  i:=Pos("call disp:  ",LowerCase(st));
  if i>0 then
   try
    i:=i+12;
    st:=copy(st,i,pos(";",st)-i);
    i:=1;
    st:=st+"  ";
    l:=Length(st)-1;
    w:="";
    k:=0;
    while i<=l do
     begin
      if st[i]+st[i+1]="  " then
       begin
        if k=0 then w:=w+" "
         else
          begin
           if k=4 then
            begin
             Item[k-1]:=copy(w,1,2);
             inc(k);
             Item[k-1]:=copy(w,3,2);
             inc(k);
             Item[k-1]:=copy(w,5,2);
             inc(k);
             Item[k-1]:=copy(w,7,2);
            end
           else Item[k-1]:=w;
           w:="";
          end;
        inc(k);
       end
      else
       if st[i]<>" " then
        w:=w+st[i];
      inc(i);
     end;
    Cps:=FilePos(f);
    if (Ln<>0) then Status.Panels.Items[0].GaugeAttrs.Position:=Round((Cps/Ln)*100);
   except
    on Exception do
     begin
      st:="Строка: "+#10+#13+"""+st+"""+#10+#13+
          "не может быть обработана."+#10+#13+
          "Номер сообщения: "+IntToStr(High(Store[0]))+#10+#13+
          "Рекомендация: Вам необходимо найти эту строку в файле и удалить.";
     MessageDlg(st,mtError,[mbOK],0);
     end;
   end;
 end;
CloseFile(f);


 
TUser ©   (2004-05-30 20:01) [7]

Вообще здесь первым делом надо избавляться от AV. Сказал бы ты, в какой строке оно происходит ... . Скорее всего где-то неправильно рассчитываешь индекс символа в строке st.


 
Schummi   (2004-05-31 08:36) [8]

что такое AV?


 
evvcom ©   (2004-05-31 08:47) [9]

Access Violation


 
Schummi   (2004-05-31 13:22) [10]

Важно не то, что AV происходит, а важно то, что потом на строчке readln(f,st) выскакивает I/O 6


 
Romkin ©   (2004-05-31 14:37) [11]

Важно именно AV, млин. Интересно, как так можно, система орет, что у тебя все мозги куда попало в программе лезут, а ты тихо это давишь и продолжаешь?
А причина проста: то, что вызвало AV, предварительно затерло все вокруг, в том числе и данные в записи F... Вот дальше и орет о неправильном дескрипторе. Хорошо еще, что неправильный :))
Объясняю еще раз: наверняка какая-то переменная у тебя объявлена сразу перед f: textfile. При записи в нее не соблюдается ее граница, и код пишет в энту самую f и дальше, пока все не запортит. Тут система засекает непорядок и орет, что кирдык. А крик ты игнорируешь... Что захотел - то и поимел


 
Schummi   (2004-06-01 08:40) [12]

А вот оно что! Вот объявление переменных


 
Schummi   (2004-06-01 08:41) [13]

var
st,w:string;
i,l,k:integer;
f:textfile;
Item:TICDMItem;
Ln,Cps:LongInt;


TICDMItem = array[0..MaxCol-1] of string;


 
Schummi   (2004-06-01 18:30) [14]

Ну так что там?


 
Palladin ©   (2004-06-01 18:46) [15]

Наивно полагать что FilePos и FileSize будут работать с textfile. Как ты себе это представил я не знаю...


 
Schummi   (2004-06-02 08:45) [16]


> Palladin ©   (01.06.04 18:46) [15]

Однако работает!



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

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

Наверх




Память: 0.5 MB
Время: 0.041 c
3-1085142959
infom
2004-05-21 16:35
2004.06.13
Как узнать в рантайме что поле может принимать Null


1-1085821811
SL!DER
2004-05-29 13:10
2004.06.13
ComboBox


1-1085842810
Yaguar
2004-05-29 19:00
2004.06.13
Может есть какая функция для работы с дин. массивом?


14-1085495783
13-Drakosha
2004-05-25 18:36
2004.06.13
BrainBench.com


4-1084034112
Sur
2004-05-08 20:35
2004.06.13
Окно на чистом API.