JSTQ Опубликовано 8 октября, 2008 Жалоба Поделиться Опубликовано 8 октября, 2008 Фукция fsearch не помогает...FSearch(< имя файла>,<список каталогов >) - поиск файла в списке каталогов. Функция имеет тип PathStr (описана в стандартном модуле Dos).procedure cr_mas(path,dirlist:pathstr);begin qwe:=''; qwe:=fsearch(path,dirlist); writeln(qwe); readkey; if (qwe = 'mass.xdb') and (scr1 = 0) then begin reset(f); for i:= 1 to filesize(f) do begin read(f,buf); mas[i]:=buf; end; scr1:=1; n:=filesize(f); end;end;На экран выводится path (имя искомого файла), заданное в основной программе, хотя по идее должна выводиться пустая строка (файла на диске нет). Соответственно можно спокойно пройти условие if (qwe = 'mass.xdb') and (scr1 = 0) и наткнуться на reset(f)... а файла-то и нету.Может я процедуру неправильно использую? В справке про нее что-то вообще мало написано, непонятно. Ссылка на комментарий
Clondike Опубликовано 8 октября, 2008 Жалоба Поделиться Опубликовано 8 октября, 2008 Странно... Может ты в переменную dirlist не тот путь пишешь? Функция FSearch работает в BP7 нормально.Возможность читать файл можно проверять так:{$I-}Assign.., Reset..If IOResult<>0 then ... пишем об ошибке...{$I+} Ссылка на комментарий
JSTQ Опубликовано 8 октября, 2008 Автор Жалоба Поделиться Опубликовано 8 октября, 2008 Может ты в переменную dirlist не тот путь пишешь?Да нет, правильно. Разве что если только есть разница между "C:\" и "c:\". В assign и fsearch все одинаково написано, перепроверял много раз.Кроме того, в разных программах эта функция у меня работает по-разному В одной помещает в переменную типа pathstr полный путь, а в этой - только имя файла Ссылка на комментарий
Clondike Опубликовано 9 октября, 2008 Жалоба Поделиться Опубликовано 9 октября, 2008 JusticeЕсли ты бы показал весь свой листинг, то я, может быть, увидел, из-за чего такое происходит ) Ссылка на комментарий
JSTQ Опубликовано 9 октября, 2008 Автор Жалоба Поделиться Опубликовано 9 октября, 2008 Если ты бы показал весь свой листинг, то я, может быть, увидел, из-за чего такое происходит )Посмотри пожалуйста. Программа в процедуре cr_mas натыкается на reset, и соответственно вылетает, если файла в директории нет.var l,m1,m2,m21,scr1,m4p1,m4p2,m4p3,sortscr:byte; mas:array[0..10001] of integer; menu1,menu2,menu3:array[1..5] of string[60]; ch1,ch2,ch3:char; f:file of integer; buf,i,j,b,k,n,asd,asd1,op1,op2,op3,op4:integer; qwe:pathstr;procedure sozd_file; begin clrscr; textcolor(9); writeln(menu1[m1]); textcolor(15); writeln('Vvedite chislo elementov'); write('n= '); textcolor(9); readln(n); randomize; rewrite(f); for i:= 1 to n do mas[i]:=i; for i:= 1 to n do begin asd:=random(n)+1; asd1:=mas[i]; mas[i]:=mas[asd]; mas[asd]:=asd1; end; for i:= 1 to n do write(f,mas[i]); writeln; textcolor(15); close(f); writeln(''); textcolor(15); writeln('File created'); writeln(''); textcolor(7); writeln('Enter - to main menu'); readln; scr1:=1; sortscr:=0; end;procedure vv_isk; begin writeln('Vvedite iskomii element'); write('k= '); textcolor(9); readln(k); end;procedure viv_pos; begin clrscr; textcolor(15); write(menu1[m1]); textcolor(9); write(' -> '); textcolor(15); writeln(menu3[m21]); end;procedure posl_p; begin i:=0; op1:=0; repeat inc(i); op1:=op1+3; until (k=mas[i]) or (i=n); if k = mas[i] then begin textcolor(9); writeln('Element naiden') end else begin textcolor(4); writeln('Element ne naiden'); end; textcolor(15); writeln(''); writeln(op1, ' operacii'); readln; end;procedure bistr_posl_p; begin i:=1; op2:=0; mas[n+1]:=k; while k<>mas[i] do begin inc(i); op2:=op2+2; end; if i<=n then begin textcolor(9); writeln('Element naiden') end else begin textcolor(4); writeln('Element ne naiden'); end; textcolor(15); writeln(op2,' operacii'); readkey; end;procedure sort; begin textcolor(15); write('Sortirovka '); for i:=2 to n do begin gotoxy(12,4); write(trunc(i / n * 100),'%'); {тут поставил пробелы, код заменялся на смайл} gotoxy(1,1); b:=mas[i]; mas[0]:=b; j:=i-1; while (mas[j]> do begin mas[j+1]:=mas[j]; j:=j-1; end; mas[j+1]:=b; end; gotoxy(1,5); writeln; writeln('Massiv otsortirovan!'); sortscr:=1; end;procedure posl_p_up_sp;begin op3:=0; i:=0; mas[n+1]:=29000; repeat inc(i); op3:=op3+2; until k<=mas[i]; if k = mas[i] then begin textcolor(9); writeln('Element naiden'); end else begin textcolor(4); writeln('Element ne naiden'); end; textcolor(15); writeln(op3,' operacii'); readln;end;procedure bin_p;begin m4p1:=1; m4p2:=n; m4p3:=0; op4:=0;{schetchik} while m4p1 < m4p2 do {op1!} begin i:=(m4p1+m4p2) div 2; {op2,3!} op4:=op4+3; if k < mas[i] then {op4!} begin m4p2:=i-1; {op5!} op4:=op4+2; end else if k = mas[i] then {op6} begin m4p1:=m4p2+1; {op7} m4p3:=1; {op8} op4:=op4+4; end else if k > mas[i] then begin m4p1:=i+1; {op9} op4:=op4+3; end; end; if m4p3 <> 0 then begin textcolor(9); writeln('Element naiden!'); end else begin textcolor(4); writeln('Element ne naiden!'); end; textcolor(15); writeln(op4,' operacii'); readkey;end;procedure cr_mas(path,dirlist:pathstr);begin qwe:=''; qwe:=fsearch(path,dirlist); {writeln(qwe); readkey;} if (qwe = 'mass.xdb') and (scr1 = 0) then begin reset(f); for i:= 1 to filesize(f) do begin read(f,buf); mas[i]:=buf; end; scr1:=1; n:=filesize(f); end;end;{mp_start=1}begin menu1[1]:='Sozdanie faila'; menu2[1]:='Da'; menu2[1]:='Net'; menu1[2]:='Schitivanie iz faila'; menu3[1]:='Posledovatelnii poisk'; menu3[2]:='Bistrii posledovatelii poisk'; menu3[3]:='Posledovatlnii poisk v uporyadochennom spiske'; menu3[4]:='Binarnii poisk'; menu3[5]:='V glavnoe menu'; menu1[3]:='Vihod'; m1:=1; m21:=1; scr1:=0; assign(f,'c:\justice\mass.xdb'); repeat repeat clrscr; for i:=1 to 3 do begin if m1 = i then textcolor(9) else textcolor(15); writeln(menu1[i]); end; ch1:=readkey; case ch1 of #72: begin dec(m1); if m1<1 then m1:=3; end; #80: begin inc(m1); if m1>3 then m1:=1; end; end; until ch1 = #13; textcolor(15); case m1 of 1: begin sozd_file; end; 2: begin clrscr; cr_mas('mass.xdb','c:\justice'); if scr1=1 then begin repeat reset(f); clrscr; for i:=1 to 5 do begin if m21 = i then textcolor(9) else textcolor(15); writeln(menu3[i]); end; ch1:=readkey; case ch1 of #72: begin dec(m21); if m21<1 then m21:=5; end; #80: begin inc(m21); if m21>5 then m21:=1; end; end; until ch1 = #13; textcolor(15); case m21 of 1: begin viv_pos; vv_isk; posl_p; {up} end; 2: begin viv_pos; vv_isk; bistr_posl_p; end; 3: begin viv_pos; vv_isk; if sortscr = 0 then sort else writeln('Massiv v faile uje otsortirovan!'); posl_p_up_sp; end; 4: begin viv_pos; vv_isk; if sortscr = 0 then sort else writeln('Massiv v faile uje otsortirovan!'); bin_p; end; 5: begin end; end; end else begin textcolor(4); writeln('File isnt created'); textcolor(7); writeln; writeln('Enter - to main menu'); readln; end; end; end; until m1 = 3;end.uses crt,dos; Ссылка на комментарий
Clondike Опубликовано 9 октября, 2008 Жалоба Поделиться Опубликовано 9 октября, 2008 Запустил прогу - всё нормально. Имя файла не выводится. (конеш убрал комент-скобки с writeln(qwe) ) Переменная qwe - пустая, до reset не доходит. Прога выводит - "Отсутствует файл".Добавлено спустя 4 минуты 55 секунд:Проверил дебаггером - в блок if ... reset ... end прога не заходит. Юзай дебаггер среды, увидишь в нем весь ход программы пошагово.Добавлено спустя 34 минуты 47 секунд:Создал у себя папку и файл c:\justice\mass.xdbДебагер показал, что переменная qwe = 'c:\justice\mass.xdb' Поэтому прога не заходит в блок Reset. 'c:\justice\mass.xdb' не равно 'mass.xdb'Сделал так:FName: string;XName: NameStr;XDir: DirStr;XExt: ExtStr;процедура FSplit(qwe, XDir, XName, XExt);FName := XName + XExt; {FName='mass.xdb'}Теперь прога в блок if.. Reset... заходит.Добавлено спустя 18 минут 7 секунд:Удалил файл. Прога в блок if.. Reset не заходит. Всё нормально!Итоги - юзай процедуру FSplit (модуль dos), чтобы не зависеть от разного поведения функции FSearch (вообще-то она должна выводить полное имя файла (с путём). думаю, что она выводит только имя файла без пути, когда ей передают пустую строку вместо пути. Пустая строка пути означает, что файл ожидается в папке, где сама прога).И пользуйся окошком дебагера Watch (туда добавить переменные), клавишами F4 (run проги до положения курсора), F7 (пошаговый ран с заходом в процедуры и функции), F8 (пошаговый ран без захода в процедуры и функции). Ctrl-F2 - снять режим дебага. Ссылка на комментарий
Clondike Опубликовано 9 октября, 2008 Жалоба Поделиться Опубликовано 9 октября, 2008 procedure FSplit(XPath: PathStr, var XDir: DirStr; var XName: NameStr; var XExt: ExtStr);Процедура модуля dos. Разбивает полное имя файла на три части: путь, имя файла и расширение.XPath - параметр типа PathStr, содержит полное имя файла 'c:\justice\mass.xdb'XDir - переменная типа DirStr, в которую процедура записывает путь 'c:\justice\'XName - переменная типа NameStr, в которую процедура записывает имя файла 'mass'XExt - переменная типа ExtStr, в которую процедура записывает расширение файла '.xdb' Ссылка на комментарий
JSTQ Опубликовано 11 октября, 2008 Автор Жалоба Поделиться Опубликовано 11 октября, 2008 Большое спасибо. Вот интересно, почему программа заходила в блок if..reset..end, когда файла на диске небыло? Я специально сделал там вывод qwe, файла нет, а она равна mass.xdb... Ссылка на комментарий
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти