![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 14.03.2012
Сообщений: 147
|
![]()
Подскажите, пожалуйста, почему программа записывает всегда разное количество строк в текстовый файл и потом прекращает свою работу? Хотя по коду она должна записывать бесконечно долго.
Код:
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,370
|
![]()
Совсем не помню, так было давно. Но один вопрос:
есть такая переменная: Код:
Тут: Код:
Код:
Но не понятно, где у этой переменной выполняется инициализация? Если в этой процедуре, Код:
Или так и должно быть? Моя логика хромает и не могу понять, что тут должно делаться.
Как-то так, ...
|
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,705
|
![]() Цитата:
![]() Ясен пень, весь процесс работы с файлом имеет 3 стадии: - открыли файл (имеющийся) или создали новый; - поработали с ним: дописали/удалили/поменяли; - закрыли файл. Тут даже программером не надо быть, обычная бабка с Комаровки поймёт, что не так, если ей рассказать словами производимые действия. |
|
![]() |
![]() |
![]() |
#4 | |
Форумчанин
Регистрация: 14.03.2012
Сообщений: 147
|
![]()
Судя по книгам по Turbo Pascal из Интернет, сначала описывается файловая переменная типа текстовый файл
Связываем файловую переменную с файлом на жестком диске Работаем с файлом, пишем строку добавляя ее в конец файла закрываем файл Файл создается один раз в процедуре Цитата:
Вроде так все работает. Подскажите, пожалуйста, что не так, я что-то не могу понять. Последний раз редактировалось ichi; 08.06.2020 в 14:02. |
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,370
|
![]()
Т.е. вы рассчитываете, что после создания файла указатель на файл будет храниться в переменной filetext, и после возвращения из процедуры?
Файловая переменная - это указатель на буфер в ОС. Буфер создаётся на стадии assign() и инициируется на стадии reset(), append(), rewrit(). После закрытия файла в переменной указатель может быть и будет храниться, вот только этот указатель будет ссылаться на область памяти, которая освобождена командой close(f). Так что, что там будет твориться и как менеджер ОС будет обрабатывать эту ситуацию - хз. Если нет, то для чего вам эта переменная? Для создания файла достаточно передать в процедуру только имя файла.
Как-то так, ...
|
![]() |
![]() |
![]() |
#6 | |
Форумчанин
Регистрация: 14.03.2012
Сообщений: 147
|
![]()
Вроде я уже писал зачем нужна эта переменная
Цитата:
Если вы намекаете, что процедуру Код:
Код:
Вот переделанный код: Код:
|
|
![]() |
![]() |
![]() |
#7 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,429
|
![]()
Во-первых, мне кажется, что работа с файловой переменной была верна в первом коде. Во-вторых, может быть проблема в том, что процедура обработки прерывания не успевает закончиться до следующего срабатывания прерывания?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,370
|
![]() Цитата:
Буфер данных будет создан при обращении к ОС - процедура assign(f, <имя файла>). В это время и будет заполнена ссылка. Ещё раз - это не привязка к файлу. Непосредственно с файлом ваша программа не работает. Там включается менеджер ОС, который и отслеживает работу вашей программы с буфером. Я намекаю на то, что эта переменная, при её использовании, должна что-то хранить - ссылку. Вы её используете, см. мой первый пост, но не инициализируете в нужное время. close(f) - не разрывает файловую переменную с файлом на диске, а убивает буфер, который был организован ОС при вызове из программы процедуры assign(). Таким образом переменная f может содержать ссылку на буфер, которого нет. Как всё это работает в режиме прерываний - не знаю. Как часто выполняются прерывания, как эти прерывания синхронизированы с работой процедур записи, ...
Как-то так, ...
|
|
![]() |
![]() |
![]() |
#9 | ||
Форумчанин
Регистрация: 14.03.2012
Сообщений: 147
|
![]() Цитата:
Цитата:
Программа заработала тогда, когда в код обработчика прерывания таймера прописал одну секундную задержку перед записью в файл. Так же в код программы добавил процедуру получения кода ошибки ввода-вывода в ходе работы с файла. Кому интересно, вот код с внесенными уже изменениями: Код:
|
||
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,370
|
![]()
А как это будет работать, если ваш код переписать:
Код:
Код:
Код:
Ошибка ввода/вывода возникает в моменты инициализации работы с файлом: reset(f), append(f), rewrite(f). Если файл был открыт, то он будет и закрыт - close(f). assign(f,<file_name>) - это обращение к ОС за получением буфера. Но это вроде всегда без проблем. На этой процедуре наличие/отсутствие файла не проверяется.
Как-то так, ...
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[Turbo Pascal][DosBox] Как все таки правильно работать с видеопамятью на прямую в текстовом режиме? | ichi | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 19.04.2020 20:30 |
Записи. Записи с вариантами. Turbo Pascal | Marksman_SwAt | Помощь студентам | 7 | 07.05.2014 19:27 |
Программа, которая запрашивает символы и записывает их в файл до пары одинаковых символов ( Turbo Pascal ) | bikmai4ik | Помощь студентам | 4 | 05.12.2013 13:57 |
Не правильно считает.(turbo Pascal) | spezzA | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 15.06.2011 17:08 |
Turbo C и Dosbox | chester997 | Общие вопросы C/C++ | 2 | 02.10.2010 13:01 |