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

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

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

 
 Ответить  Открыть новую тему 
> Проверка наличия файла.
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


А как применить это? А то не могу сообразить совсем
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;


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


Новичок
*

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

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


я имею ввиду макс. количество записей пусть будет 1000. но сделать это так, чтобы пользователь мог ввести 1 запись и выйти при назжатии, допустим, Esc.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

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

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


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


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

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

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


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


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


Новичок
*

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

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


.......смотреть выше
Else Writeln('файл не найден');
------
error in statement 113
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

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

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


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


Новичок
*

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

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


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


Гость






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

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


Новичок
*

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

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


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


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


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

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


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

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

Репутация: -  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

 





- Текстовая версия 24.04.2024 10:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name