Помощь - Поиск - Пользователи - Календарь
Полная версия: Проверка наличия файла.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Михаил
Это опять я беспокою вас со своими БД. Не подскажете как сделать проверку на наличие файла в этом случае:
Procedure ReadBD(var DBB:aREC);
Var
I:byte;
S:string;
f:text;
Begin
write('Enter path: (введите путь к файлу):'); readln(s);
assign(f,s);
reset(f);
for i:=1 to MaxRec do
begin
 with DBB[I] do
 begin
  readln(f,name);
  readln(f,number)
 end
end;
close(f)
end;


И как сделать так чтобы данные заносились до не определённого уровня, пока пользователь не нажмёт какую-нибудь клавишу?
Procedure EnterBD(var DBB:aRec);
var
i:byte;
begin
for i:=1 to MaxRec do
begin
 with DBB[i] do
 begin
  write('Enter name:');
  readln(name);
  write('Enter numbel:');
  readln(number)
 end
end
end;


М
Пользуйся тегами CODE !
klem4

klem4

function FileExists(var F : file; path : string) : boolean;
begin
   assign(f, path);
   {$i-}
   reset(f);
   {$i+}
   FileExists := (IOResult=0)
end;

// функция вернет true если файл существует и откроет его для чтения

Михаил
А как применить это? А то не могу сообразить совсем
volvo
Procedure ReadBD(var DBB:aREC);
...
Begin
  write('Enter path: (введите путь к файлу):'); readln(s);
  assign(f,s);
  {$I-} reset(f); {$I+}
  If IOResult = 0 Then Begin
    for i:=1 to MaxRec do begin
      { читать записи }
      close(f)
    end
  Else Writeln('файл не найден');
end;


Цитата
И как сделать так чтобы данные заносились до не определённого уровня, пока пользователь не нажмёт какую-нибудь клавишу?
А вот это, извини, не получится... Какой размер массива ты задал? А если пользователь захочет внести больше? Ошибка будет...
Михаил
я имею ввиду макс. количество записей пусть будет 1000. но сделать это так, чтобы пользователь мог ввести 1 запись и выйти при назжатии, допустим, Esc.
klem4

i := 1;
repeat
   write('x[',i,']=');
   readln(x[i]);
   writeln('Будете вводить еще ? [Y/N]');
   repeat
      ch := readkey;
   until ch in  ['y','Y','n','N'];
   if ch in ['n','N'] then inc(i);
until ch in ['y','Y'];

   


ну вот такое изврощение можешь сделать ...
Михаил
volvo, что-то не катит. ошибку 113 выдаёт. точней сначала, почему нет <;> после слова end (после которого следует else), а после 113 на строчке else
klem4
Ты бы код привел, у нас штатный телепат в отпуске до 30-го ...
volvo
Пишешь такую функцию (которая читает строку максимальной длины max_len, но при нажатии Esc сразу же возвращает пустую строку):
uses crt;

function get_str(max_len: byte): string;
 var s: string; ch: char;
 begin
   s := '';
   repeat
     ch := readkey;
     if length(s) <= max_len then
       case ch of
         #27: begin
                   get_str := '';
                   exit;
                 end;
         #8: begin
               if length(s) > 0 then begin
                 write(#8,#32,#8);
                 delete(s, length(s), 1)
               end
             end
         else
           if length(s) <> max_len then
             begin s := s + ch; write(ch) end
       end;
   until ch = #13;
   writeln;
   get_str := s
 end;

(взято отсюда: FAQ: Строки, и доработано под конкретную задачу...)

и немного корректируешь EnterBD:
Procedure EnterBD(var DBB:aRec);
var
  i:byte;
  finished: boolean;
begin
  i:=1; finished := false;
  while (i <= maxRec) and (not finished) do
    with DBB[i] do begin
      write('Enter name:'); name := get_str(80);
      if name <> '' then begin
        write('Enter number:'); readln(number)
      end
      else finished := true;
      inc(i)
    end;
end;

и попробуй во время набора имени нажать Escape wink.gif
Михаил
.......смотреть выше
Else Writeln('файл не найден');
------
error in statement 113
volvo
Михаил, я не давал полный код для проверки файла... Полная процедура выглядит так:
Procedure ReadBD(var DBB:aREC);
Var
  I:byte;
  S:string;
  f:text;
Begin
  write('Enter path: (введите путь к файлу):'); readln(s);
  assign(f,s);
  {$I-} reset(f); {$I-}
  If ioresult = 0 Then begin
    for i:=1 to MaxRec do begin
      with DBB[I] do begin
        readln(f,name); readln(f,number)
      end
    end;
    close(f)
  end
  else Writeln('file not found');
end;
Михаил
Всё работает. Огромное спасибо! smile.gif
Только вот блок-схему осталось сделать. Делал раньше на элементарные программы, а на такую как делать не представляю
unsure.gif
Михаил
А нет. Есть всё же одна ошибка. Когда введёшь определённое кол-во данных и нажмёшь Esc, то после этого не сохр. в файл. Ошибка 202. И кроме того, когда набираешь телефон и жмёшь esc, то всё работает нормально, а с именем выходит в меню
volvo
Цитата
Когда введёшь определённое кол-во данных и нажмёшь Esc, то после этого не сохр. в файл. Ошибка 202.
Ну вот объясни мне, как сохранение в файл связано с Error 202 (переполнение стека) ? Я например этого не понимаю...

Цитата
И кроме того, когда набираешь телефон и жмёшь esc, то всё работает нормально, а с именем выходит в меню
А что ты считаешь "нормально"? Оно как раз и должно в меню выходить... Ты ж прервал процесс ввода, что теперь прикажешь программе делать? wacko.gif А если тебе надо, чтобы и по телефону оно в меню выходило, то исправь соответствующим образом (сделай как в имени)...
Михаил
Вообще не могу понять при чём тут ошибка 202. Выложил прогу. Взгляни если не лень..
я просто не знаю к чему могут предраться преподы, но думаю из-за таких мелочей точно баллы понизят
Altair
Цитата
Вообще не могу понять при чём тут ошибка 202

Я компилил на FPC все ок, все работает..
но
Код
MaxRec=200;
Type
REC=record
    Name:string;
    Number:string[8];
   end;
aRec=array[1..MaxRec] of rec;

это
200*(256+8) = 52800
хы..
напиши в начале проги
{$M 65500, 0,0}
и проверь.
Altair
тепреь к тому , к чму можно придраться..
Procedure PrintBD(DBB:aRec);
var i:byte;
begin
for i:=1 to MaxRec do
begin
 writeln(i,'. NAME= ',DBB[I].NAME);
 writeln('Number = ',DBB[I].NUMBER);
end;
writeln('нажмите любую клавишу ...');
readkey
end;

unsure.gif
зачем ты все записи выводишь ? ведь у меня база может состоять из 3 записей а ты все 200 выведешь.. поставь условеи:
for i:=1 to MaxRec do if DBB[i].NAME<>'' then
begin
 writeln(i,'. NAME= ',DBB[I].NAME);
 writeln('Number = ',DBB[I].NUMBER);
end;

те же условия при записи в файл.. не надо пустое выводить никуда..
при чтении из файла тогда меняем
If ioresult = 0 Then begin
    for i:=1 to MaxRec do begin

на что то типа

i:=1;
while not eof(f) do begin
inc(i);
with DBB[I] do begin
        readln(f,name); readln(f,number)
      end
end;

идею понял ? читаем файл пока он не кончиться...
а то ты так есил будешь читать то файл может раньше закончиться и получишь ты ошибку чтения...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.