IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Проверка наличия файла.
Михаил
сообщение 24.11.2005 21:26
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Это опять я беспокою вас со своими БД. Не подскажете как сделать проверку на наличие файла в этом случае:
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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 24.11.2005 21:31
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +



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

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



--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Михаил
сообщение 24.11.2005 21:39
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


А как применить это? А то не могу сообразить совсем
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.11.2005 21:39
Сообщение #4


Гость






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;


Цитата
И как сделать так чтобы данные заносились до не определённого уровня, пока пользователь не нажмёт какую-нибудь клавишу?
А вот это, извини, не получится... Какой размер массива ты задал? А если пользователь захочет внести больше? Ошибка будет...
 К началу страницы 
+ Ответить 
Михаил
сообщение 24.11.2005 22:28
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


я имею ввиду макс. количество записей пусть будет 1000. но сделать это так, чтобы пользователь мог ввести 1 запись и выйти при назжатии, допустим, Esc.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 24.11.2005 22:38
Сообщение #6


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +



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




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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Михаил
сообщение 24.11.2005 22:43
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


volvo, что-то не катит. ошибку 113 выдаёт. точней сначала, почему нет <;> после слова end (после которого следует else), а после 113 на строчке else
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 24.11.2005 22:44
Сообщение #8


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.11.2005 22:47
Сообщение #9


Гость






Пишешь такую функцию (которая читает строку максимальной длины 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
 К началу страницы 
+ Ответить 
Михаил
сообщение 24.11.2005 22:51
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


.......смотреть выше
Else Writeln('файл не найден');
------
error in statement 113
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.11.2005 22:53
Сообщение #11


Гость






Михаил, я не давал полный код для проверки файла... Полная процедура выглядит так:
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;
 К началу страницы 
+ Ответить 
Михаил
сообщение 24.11.2005 23:01
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Всё работает. Огромное спасибо! smile.gif
Только вот блок-схему осталось сделать. Делал раньше на элементарные программы, а на такую как делать не представляю
unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Михаил
сообщение 24.11.2005 23:48
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


А нет. Есть всё же одна ошибка. Когда введёшь определённое кол-во данных и нажмёшь Esc, то после этого не сохр. в файл. Ошибка 202. И кроме того, когда набираешь телефон и жмёшь esc, то всё работает нормально, а с именем выходит в меню
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.11.2005 23:55
Сообщение #14


Гость






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

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


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


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


Прикрепленные файлы
Прикрепленный файл  BD1tip.pas ( 3.01 килобайт ) Кол-во скачиваний: 178
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 25.11.2005 0:50
Сообщение #16


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 25.11.2005 0:55
Сообщение #17


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


тепреь к тому , к чму можно придраться..
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;

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 7:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"