ALeXkRU
![](http://forum.ru-board.com/board/avatars/private/ALeXkRU.gif)
Platinum Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору mmotop20oo12 Цитата: что-то не улавливаю. 1ая часть кода, в файл записывается постоянно 1 и та же запись "student" просто поочереди с разными полями | не, не улавливаешь (ты только ссылочку на код давай, чтобы не искать, о каком коде речь) первая часть, как ты выразился, (в этом примере) в цикле заполняет поля записи значениями, а потом эта запись пишется в файл. Это нормально: зачем заводить кучу переменных(записей), если они нужны только, чтобы в файл записать. Что-то подобное и тебе для заполнения базы вопросов прогодится (только, вряд ли с циклом: вопросы-ответы же придётся с формы вводить, значит - по одной записи). Код: {создание файла} assign(f, 'student.dat'); // создаём файл, связываем файловую переменную с ним rewrite(f); // подключаемся к файлу, открываем для чтения и записи. Если файл был, он очистится! for i := 1 to n do // цикл по кол-ву студентов begin with student do // цикл по полям записи. Используют, чтобы не писать student.isstudent, student.fio, student.kurs begin isstudent := true; // начинаем заполнять, статус: студент str(i, s); // число в строку fio := 'Студент' + s; // заполняем ФИО kurs := random(5) + 1; // заполняем курс, случайным числом от 1 до 5 end; write(f, student); // пишем i-ю запись в файл end; close(f); // закрываем файл. В него сохраняются все 5 записей | Т.е. после работы этого блока в файле окажется записана информация о пяти студентах (их статус,ФИО и курс). Файл заполнится. Смотреть содержимое типизированных файлов в блокноте довольно бессмысленно Главное - ничего в них не менять вручную, только строго из программы! Кучу пробелов ты увидел, потому, что в записи для ФИО выделено 128 символов. А всяких служебных символов (каких-то значков) там может быть много: всё зависит от типов, которые используются в записях.. Кстати, вот хороший пример работы с файлом/базой (только, просто не обращай внимания на всё, что про меню, у тебя его функцию будет выполнять форма с полями и кнопками), и более наглядный, чем тот. И ещё, используй Write и Read, без Ln-ов... Не забывай, что непосредственно запись в файл происходит при закрытии этого файла {close(f);}. Не закроешь - ничего не запишется! Во второй части последовательно читаются {read(f, student);} все данные из файла (в цикле, пока не встретится конец файла) в соответствующие поля записи, и выводятся на экран значения полей ФИО и Курс (в цикле, выделенном курсивом) Код: {вывод данных из файла} writeln('вывод данных из файла:'); reset(f); // открываем для чтения while not eof(f) do // цикл, пока не встретим конец файла - EOF begin read(f, student); // собственно, читаем запись with student do begin write(fio:2); // выводим на экран полученные значения полей записи writeln(kurs:2); end; end; close(f); |
Цитата: после read сразу запись student автоматически заполняется всеми данными, даже если я их не вижу в этом файле? | Нет, с read - только чтение может происходить, а после её работы - что-то будет прочитано в соответствующую переменную, здесь - student. Тебе, в своём примере, нужно будет читать данные из файла(базы) в запись-вопрос, а дальше, полученные сведения из соответствующих полей записи использовать в форме опроса. Третья часть - пример работы с готовым файлом-базой. Когда нужно получить из него информацию, что-то изменить, дополнить.. Код: {обработка данных в файле} reset(f); i:=0; // счётчик в ноль while i<filesize(f) do // берём размер файла { filesize(f) }. Цикл, пока счётчик меньше числа записей в файле begin seek(f,i); // перемещаемся в файле f в начало i-той записи read(f, student); // читаем данные этой записи в переменную with student do // работаем с прочитанной записью begin kurs := kurs + 1; // переводим на след.курс if kurs > 5 then // выпускники isstudent := false; {выпустился} //меняем статус student.isstudent end; seek(f,i); // после чтения - курсор в начале i+1 записи, перемещаемся в файле f в начало i-той записи write(f,student); // записываем новые данные в файл. Т.е. вместо старой записи в файле пишем новые значения в файл, на то же место! inc(i); // увеличиваем счётчик, к повтору цикла end; close(f); | Цитата: разве мы не добавили просто в начало (перед 1ой записью) еще 1 запись, только измененную? | Нет. режима вставки в файл тут нет. Если начнёшь запись не в конце файла, уже записанная информация будет заменяться. Цитата: Мы же не писали rewrite и ни чего не удаляли | И это - правильно После Rewrite вся (!) информация в файле затрётся! Он, считай, создастся заново. Ещё примерчик (побольше процедур и функций работы с файлами) Цитата: Потом делаем inc(i): в файле куча пробелов, а позицию увеличили всего на 1 и что? мы все равно переместимся к месту хранения 2ой записи? | В таких файлах информация хранится строго блоками, каждый из которых равен одной записи (та самая, которая record, создана была). Причём только именно такого типа записей. Поэтому и типизированный файл. В этом примере - файл состоит из записей-блоков stud, у тебя - Rec.. Увеличение счётчика на единицу, перемещает к следующей записи, и т.д. Цитата: А вот если я закончил работу вышел из программы, но мне когда-то понадобится добавить в конец еще 1 студента и при этом сохранить всех предыдущих, как мне перейти в конец файла и потом добавить еще 1 студента? Append же использовать не можем | Как раз, третий блок из примера: только курсор перемещаешь перед записью не в начало первой записи, а в конец последней - Код: {добавляем данные в файл} assign(f, 'student.dat'); reset(f); seek(f, filesize(f)); // перемещаемся в файле f в конец файла, встаём после последней записи with student do // работаем с записью begin writeln('введите ФИО нового студента: '); readln(fio); writeln('введите курс нового студента: '); readln(kurs); isstudent := true; //меняем статус student.isstudent, стал студентом end; write(f,student); // записываем новые данные в файл. Т.е. в файл пишем/добавляем новую запись close(f); | С помощью функции Filepos всегда можно узнать на какой записи стоит курсор в файле в данный момент (не должен быть больше конца файла) Добавлено: mmotop20oo12 20:20 15-02-2015 Цитата: я подумал, может мне создать Запись и создать массив таких записей и в файл записать (по окончании работы) только 1 массив. | В массив записи считывать из файла в цикле можно. А записать сразу массив - нет. Всё равно запись в файл идёт по штучно, по одной записи. Значит - тоже в цикле. А откуда ты берёшь данные для записи в файл, зависит от того, в каком виде хранится в этот момент информация. Как удобнее. В данном случае особого смысла заполнять массив не видно. Цитата: по мойму, что бы работать со всеми вопросами мне достаточно будет прописать: assign (f,'name.txt/dat'); reset(f); read(f,<мой массив записей>); close(F); После этих операторов я же могу как хочу работать со всеми записями в массиве, верно? А когда закончу просто снова rewrite(f) write(f,<мой массив записей, в который я до этого заключил данные из кода выше>); close(F); Все будет в порядке? | Нет, не будет в порядке. У тебя указан тип данных для файла, и только переменные этого типа можно записать в файл, именно с такой структурой.. И читать ты можешь тоже только по одной записи за раз, а уже потом помещать в массив (в цикле) - пожалуйста. Про rewrite(f) смотри выше. MERCURY127 прав: такой файл (типизированный) по сути - тот же массив, только хранится не в памяти а на диске. Поэтому и работа с ними очень похожа. ЗЫ: а зачем в имени файла красненькая добавка нужна? Да и для типизированных файлов расширение .txt - плохая идея... Много вероятности, что файл откроется в блокноте и изменится, после чего инфа из него будет утрачена: он будет непригоден для работы. Лучше таки 'name.dat' |