Вопрос № 49334: при выполнении команды - readln(g,st)
выходит сообение - File not open for input
что нужно сделать, чтобы считать сиз файла выбранную мною строку, например четвертую?...
Вопрос № 49.334
при выполнении команды - readln(g,st)
выходит сообение - File not open for input
что нужно сделать, чтобы считать сиз файла выбранную мною строку, например четвертую?
Отвечает: aaqs
Здравствуйте, Терсков Алексей Николаевич!
А зачем сразу после того, как Вы открыли файл на чтение (Reset(...)) тут же открывать его на запись с уничтожением содержимого (Rewrite(...)) - отсюда и возникает ошибка. Выход => нужно убрать строку rewrite(g);
А для того что бы прочитать 4-ю строку нужно вставить соответсвенно 4-ре Readln (g); или использовать функцию seek (g, <...>);
Ответ отправил: aaqs (статус: 5-ый класс)
Ответ отправлен: 17.07.2006, 10:18
Отвечает: sir henry
Здравствуйте, Терсков Алексей Николаевич!
Если хотите открыть файл одновременно для чтения и для записи, то воспользуйтесь файловыми потоками TDosStream. Однако при этом содержимое файла теряет определенность и определение типа данных ложиться на программиста.
Чтобы облегчить чтение данных из файла, Вы можете записывать туда не отдельные компоненты записи, а целиком всю запись gameass.
Var
t: PDosStream;
game: gameass;
Begin
t:=New(PDosStream, Init('D:games.txt', stOpen)); {Если файл уже существует}
t^.Write(game, sizeof(gameass)); {Записываем данные в файл}
t^.Read(game, sizeof(gameass)); {Читаем данные из файла}
t^.Close;
End;
Находить компонент будет проще по его номеру с помощью функции Seek(), при этом размер данных, через который будет скакать эта функция определяется размером записи умноженым на размер буфера. Буфер, предварительно, лучше выставить по размеру записи.
При этом, чтобы не записывать громадные пустоты в файл, а такое неприменно будет при типе данных STRING, необходимо жестко определится с размером строковых составляющих записи.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 17.07.2006, 11:26
Отвечает: METALLDOCTOR
Здравствуйте, Терсков Алексей Николаевич!
Попробую изложить, что вы делаете:
assign(g,'D:games.txt');
Грубо говоря, присваиваете переменной g конкретный файл
reset(g);
Перебрасываете "каретку" для чтения в начало файла - готовитесь прочитать его сначала.
rewrite(g);
Перебрасываете "кеаретку" для записи в начало файла, при этом очищаете файл - готовитесь записывать в файл, тем самым делдаете бессмысленным предыдущее действие.
writeln(' skolko igrushek v magazine? ');
readln(k);
Вывод на экран и ввод оттудаже
for i := 1 to k Do
begin
with game do
begin
readln(name,cen,kol,max,min);
write(g,name);
write(g,cen);
write(g,kol);
write(g,max);
write(g,min);
end;
end;
Запускаете запись в файл того, что вводят с экрана. При этом, видимо, Вы полагаете, что работаете с типизированным файлом и всё, что Вы в него записываете упорядочивается (что ещё можно иметь в виду, используя With?).
Вынужден вас разочаровать, это не так, в Ваш файл всё пишется подряд:
type t = text;
var g : t;
Означает, что g - текстовый файл, а не типизированный, но сейчас мы разбираем другой вопрос.
Далее:
readln(g,st);
Ввы пытаетесь прочитать что-то из файла, который перед этим очистили и теперь благодаря Rewrite прочитать из него ничего нельзя. И вообще в этой строке смысла - 0, ибо сразу после этого вы закрываете файл и программу. Но если вам всё-таки очень хочется прямо этой программой ещё чего-то читать из свежезаполненного файла, то вам надо перед этой строкой вставить Reset(g); и только после этого можно будет читать что-то из него.
--------- Ни о чём не жалею!
Ответ отправил: METALLDOCTOR (статус: 6-ой класс)
Ответ отправлен: 17.07.2006, 12:01 Оценка за ответ: 4 Комментарий оценки: Тут все верно, но прозой написано =) Оператор With, нужен тут для того, чтобы не писать каждый раз слово - game. Вы это знаете ) Сурц я уже откорректировал, единственное, что мне нужно - это произвольный доступ к файлу, которого в паскале - нет, т.к. только к типизированному файлу есть Random Access, а в файле текстового типа обратиться можно только
к целой строке, что мне не оч. нравиться. Я хочу каждую строчку в файле обрабатывать отдельно, 5 строк - одна игрушка.
Отвечает: Gh0stik
Здравствуйте, Терсков Алексей Николаевич!
После прочтения предыдущих ответов я решил все-таки Вам ответить, предлагаю Вам использовать типизированный файл для хранения данных.
Тогда переход на нажную Вам запись осуществляется с помощью процедуры Seek(f,n) (где f - это типизированный файл, а n - номер записи на которую нужно перейти). Только обращаю Ваше внимание нумерация записей в типизированном файле начинается с нуля (так что не забывайте делать "поправку на ветер").
Так же Вам придется использовать такий функции для работы с типизированными файлами: FileSize(f) - возвращает текущий размер файла; FilePos(f) - возвращает текущую позицию указателя файла.
Привожу пример измененной в соответствии с комментариями Вашей программы.
Удачи!!!
Приложение:
--------- Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Студент)
Ответ отправлен: 19.07.2006, 11:36