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

> Правила раздела!

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

> ReadLn после "assign" и "close", Что с ним? :)
сообщение
Сообщение #1





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

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


При использовании в своём коде ReadLn'а (удивительно, да? smile.gif ), он работает, как нужно (неожиданно..smile.gif ). Как только я вписал кодик для того, чтобы создавался файл (либо вынимались данные из уже созданного), естественно со всеми assign, rewrite/reset, close, как положено, то обычная функция ReadLn (даже без дополнительных параметров типа readln(f,1)) вообще превращается в нечто для вылетания ошибки. Компиляции проходят успешно, но когда до этого ReadLn'а доходит в самой программе, то выдаёт ошибку 104: File not open for input. Нет, это я конечно понимаю, если бы я вставил этот РидЛн после "ассигна", не написав при этом "реврите/ресет" и не закрыв, то можно было бы согласиться с этой ошибкой. Но по какой причине он ко мне припирается в данном случае? о_0 Тем более ошибка "Файл не открыт для ввода", а функция Readln (прочитать), а не Writeln (записать). Что это за беспредел вообще? smile.gif
Кстати, если писать просто "Read;", а не "ReadLn;", то всё нормально.. Но я хочу именно ReadLn... =\
Юзаю обычный Turbo Pascal досовский
Спасибо за внимание.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2





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

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


Цитата(Lapp @ 25.04.2009 18:46) *

Боюсь, что не то же самое smile.gif. Речь, как я понял, идет о закрытии файла и попытки писать в него же. И если бы я закрыл input перед ReadLn'ом в конце программы - боюсь, я получил бы ту же ошибку. Нет, это не одно и то же)), отнюдь. И именно это я хотел сказать: не надо закрывать дверь перед тем, как входить

Lapp, как раз, ты меня не понял) Я ж конечно не настолько чайник, чтоб assign'ить, close'ить файл, а потом пытаться в него писать. "ReadLn;" я уже использую после этого (и это вообще никак не относится к файлу), чтобы, как раз как понял volvo, ждать нажатия Enter, вместо применения более длинного кода.

Цитата(volvo @ 25.04.2009 8:47) *

begin
assign(input, 'a.txt'); rewrite(input);
write(input, 'just a test');
close(input);
readln;
end.
будет - и должен - вылетать именно по 104 ошибке (под TP7). Меня же интересует не это... Меня больше интересует в данной ситуации не то, почему НЕ отработал ReadLn, а то, почему при этом отработал Read...

Вот.. У меня как раз код с assign(input,'blablabla.txt');. Использовал input, т.к. работал с файлами до этого только один раз. А вот сегодня спросил у препода, почему ошибка при РидЛне. input и output ведь какие-то стандартные "что-то-там". Но всё-равно непонятно, почему он всё ещё обрабатывает ReadLn, как-будто всё ещё работает с файлом, ведь я его закрыл, и Паскаль ведь должен был про него "забыть"?) Да ещё и параметры, в какой файл "читать", не задаю.. А про просто "read;", не знаю, но работает) Понял, вроде, что надо задавать в var переменную..
Так.. У меня раньше было (остальные куски вырезал, т.к. они как мне кажется не имеют отношения к делу):
uses crt,dos;
var {здесь файловая переменная не задавалась}
procedure game_over;
begin
clrscr;
write('Game over. Press Enter to quit');
readln;
end;

begin
assign(input,'c.txt');
{$I-} reset(input); {$I+}
if IOResult <> 0 then Rewrite(input)
else
begin
for i:=1 to 5 do
readln(input,cha[i]);
a:=cha[1];
b:=cha[2];
c:=cha[3];
d:=cha[4];
f:=cha[5];
end;
close(input);
game_over;
end.



Теперь:
uses crt,dos;
var save: file of integer;
procedure game_over;
begin
clrscr;
write('Game over. Press Enter to quit');
readln;
end;

begin
assign(save,'c.txt');
{$I-} reset(save); {$I+}
if IOResult <> 0 then Rewrite(save)
else
begin
for i:=1 to 5 do
readln(save,cha[i]);
a:=cha[1];
b:=cha[2];
c:=cha[3];
d:=cha[4];
f:=cha[5];
end;
close(save);
game_over;
end.


Но теперь компилятор около "readln(save,cha[i]);" мне пишет ошибку 63: Invalid file type. Я так понял, мне нужен другой файловый тип..? Там какие-то типизированные, текстовые, нетипизированные, фиг разберёшься. У меня, похоже, типизированный.. Мне надо его сделать текстовым? В чём тогда их различие? Прочитал какие-то страницы в учебнике, но так и не понял.

Сообщение отредактировано: ApTeMoHnv -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

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


Цитата(ApTeMoHnv @ 25.04.2009 23:47) *
:
uses crt,dos;
var {здесь файловая переменная не задавалась}
procedure game_over;
begin
clrscr;
write('Game over. Press Enter to quit');
readln;
end;

begin
assign(input,'c.txt');
{$I-} reset(input); {$I+}
if IOResult <> 0 then Rewrite(input)
else
begin
for i:=1 to 5 do
readln(input,cha[i]);
a:=cha[1];
b:=cha[2];
c:=cha[3];
d:=cha[4];
f:=cha[5];
end;
close(input);
game_over;
end.



Стандартный ReadLN работает именно через input. По умолчанию input открыт, и связан с вводом с клавиатуры. Ты же направил его на другой файл, закрыл и всё. Можно направить его обратно на клавиатуру строчкой Assign(input, ''); Reset(input); Но лучше стандартные файловые переменные вообще не трогать, чтобы такой путаницы не было. Их трогают только на олимпиадах по программированию, когда ввод идёт только из файла taskname.in. Это в угоду скорости написания в ущерб стилю.
Цитата


Теперь:
uses crt,dos;
var save: file of integer;
procedure game_over;
begin
clrscr;
write('Game over. Press Enter to quit');
readln;
end;

begin
assign(save,'c.txt');
{$I-} reset(save); {$I+}
if IOResult <> 0 then Rewrite(save)
else
begin
for i:=1 to 5 do
readln(save,cha[i]);
a:=cha[1];
b:=cha[2];
c:=cha[3];
d:=cha[4];
f:=cha[5];
end;
close(save);
game_over;
end.


Мне надо его сделать текстовым?

Да.
Цитата

В чём тогда их различие? Прочитал какие-то страницы в учебнике, но так и не понял.

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
ApTeMoHnv   ReadLn после "assign" и "close"   25.04.2009 3:35
volvo   Ты хочешь здесь устроить соревнование телепатов чт…   25.04.2009 4:40
Contest   Мне вот эти слова особено понравились: если бы я в…   25.04.2009 4:52
Lapp   Извиняюсь, последний пост мой..   25.04.2009 4:54
Lapp   Сейчас зашел и обратил внимание на то, что как-то …   25.04.2009 8:37
volvo   Lapp, а ты что, никогда не завершал программу Read…   25.04.2009 11:47
Lapp   когда то же самое делает автор?Боюсь, что не то же…   25.04.2009 21:46
ApTeMoHnv   Боюсь, что не то же самое :). Речь, как я понял,…   26.04.2009 2:47
TarasBer   : uses crt,dos; var {здесь файловая переменная не …   26.04.2009 15:32
volvo   А теперь, что называется "вопрос на засыпку…   26.04.2009 17:28
ApTeMoHnv   По-идее, в 1ом случае, будет выдавать ошибку 104, …   27.04.2009 3:18
volvo   По опыту? Ну, тогда запусти второй вариант и посмо…   27.04.2009 5:25
ApTeMoHnv   Из источника по подготовке к информатике: "Ос…   29.04.2009 0:59
TarasBer   Но то, что у меня не учитывал Enter, а сразу выход…   29.04.2009 1:07
volvo   Ну-ну... Во-первых, кто тебе сказал, что с клавиат…   29.04.2009 1:15
ApTeMoHnv   Вроде бы понятней.. Только вот почему при использо…   29.04.2009 2:16
TarasBer   RTFM сообщение номер 9 в этой теме. Потом что Read…   29.04.2009 2:21
ApTeMoHnv   А, всё.. Теперь точно понял.. Перечитал..) В общем…   29.04.2009 3:25


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

 





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