Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Проверка наличия файла.

Автор: Михаил 25.11.2005 1:26

Это опять я беспокою вас со своими БД. Не подскажете как сделать проверку на наличие файла в этом случае:

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 25.11.2005 1:31


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

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


Автор: Михаил 25.11.2005 1:39

А как применить это? А то не могу сообразить совсем

Автор: volvo 25.11.2005 1:39

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;


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

Автор: Михаил 25.11.2005 2:28

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

Автор: klem4 25.11.2005 2:38


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'];




ну вот такое изврощение можешь сделать ...

Автор: Михаил 25.11.2005 2:43

volvo, что-то не катит. ошибку 113 выдаёт. точней сначала, почему нет <;> после слова end (после которого следует else), а после 113 на строчке else

Автор: klem4 25.11.2005 2:44

Ты бы код привел, у нас штатный телепат в отпуске до 30-го ...

Автор: volvo 25.11.2005 2:47

Пишешь такую функцию (которая читает строку максимальной длины 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;

(взято отсюда: http://forum.pascal.net.ru/index.php?showtopic=2361&view=findpost&p=38136, и доработано под конкретную задачу...)

и немного корректируешь 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

Автор: Михаил 25.11.2005 2:51

.......смотреть выше
Else Writeln('файл не найден');
------
error in statement 113

Автор: volvo 25.11.2005 2:53

Михаил, я не давал полный код для проверки файла... Полная процедура выглядит так:

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;

Автор: Михаил 25.11.2005 3:01

Всё работает. Огромное спасибо! smile.gif
Только вот блок-схему осталось сделать. Делал раньше на элементарные программы, а на такую как делать не представляю
unsure.gif

Автор: Михаил 25.11.2005 3:48

А нет. Есть всё же одна ошибка. Когда введёшь определённое кол-во данных и нажмёшь Esc, то после этого не сохр. в файл. Ошибка 202. И кроме того, когда набираешь телефон и жмёшь esc, то всё работает нормально, а с именем выходит в меню

Автор: volvo 25.11.2005 3:55

Цитата
Когда введёшь определённое кол-во данных и нажмёшь Esc, то после этого не сохр. в файл. Ошибка 202.
Ну вот объясни мне, как сохранение в файл связано с Error 202 (переполнение стека) ? Я например этого не понимаю...

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

Автор: Михаил 25.11.2005 4:04

Вообще не могу понять при чём тут ошибка 202. Выложил прогу. Взгляни если не лень..
я просто не знаю к чему могут предраться преподы, но думаю из-за таких мелочей точно баллы понизят


Прикрепленные файлы
Прикрепленный файл  BD1tip.pas ( 3.01 килобайт ) Кол-во скачиваний: 240

Автор: Altair 25.11.2005 4:50

Цитата
Вообще не могу понять при чём тут ошибка 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 25.11.2005 4:55

тепреь к тому , к чму можно придраться..

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;

идею понял ? читаем файл пока он не кончиться...
а то ты так есил будешь читать то файл может раньше закончиться и получишь ты ошибку чтения...