Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.87 c
1-1085818423
BDRON
2004-05-29 12:13
2004.06.13
reset для файла на CD-ROM


1-1086077343
Oyster
2004-06-01 12:09
2004.06.13
Поиск в TMemo


14-1085738439
syte_ser78
2004-05-28 14:00
2004.06.13
Учебник по Turbo Vision


1-1085850610
Сергей
2004-05-29 21:10
2004.06.13
Редактор для программы


4-1083927183
denis24
2004-05-07 14:53
2004.06.13
External exception C000008





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский