Помогите пожалуйста, работа с файлами...

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Помогите пожалуйста, работа с файлами...

Сообщение *13* » 14.12.2006 16:39:07

добрый день, уважаемые юзеры форума :roll:
мне нужна ваша помощь в написании программы.
поверьте, прежде чем создать топик я перерыл много литературы на этом сайте, смотрел как работают те или иные процедуры- но у меня не получается :oops:
задали мне кароче, вот такую вот программу.
Нужно создать типизированны файл записей, содержащий следущюю информацию:
- фамилия
- год рождения
- номер телефона
В созданном файле нужно найти сведения о сотрудниках 1970-1980 годах рождения. как создавать файл, и вводит ьв него нужные данные, я понял. возможно выбрал не совсем лёгкий, возможно даже и глупый пут- но все создаётся :D а вот с поиском инфы в файле, а точнее цифр от 1970 до 1980 возникли проблемы... програма выдает на этом месте какюуто ошибку, и не смотря на readkey; в конце , все равно закрывается. кстати, компиляцию прога проходит замечательно.
пожалуйста, исправьте ошибки если можете, пока у меня окончательно не рассплавился мозг :)
Код: Выделить всё
program yeeeaah;

{$mode objfpc}{$H+}

uses crt;
const
  n=4;
type
  yeah = record
  surname:string[30];
  year:1900..2000;
  telefon:111111..7999999;
end;
type
  fail = text;
var
  a:array[1..n] of yeah;
  f:fail;
  filename:string[20];
  i:byte;
  surname1:string[30];
  year1:1900..2000;
  telefon1:111111..7999999;
 
begin
writeln('Kakoje bi vi hoteli vibrat imja faila? ( <= 20 simvolov)');
readln(filename);
Assign(f,filename);
Rewrite(f);
writeln('Teper, zapolnite pojalusta fail zapisami po tipu:');
writeln(' - familia (do 30 simvolov)');
writeln(' - god rojdenia (zifra ot 1900 do 2000');
writeln(' - nomer telefona (zifra ot 111111 do 7999999');
writeln('                    P.S.');
writeln('Na dannij moment programa podderjivaet ',n,' zapisej v fail');
for i:=1 to n Do
   begin
   with a[i] Do
     begin
     readln(surname);
     readln(year);
     readln(telefon);
   end;
   write(f,a[i].surname); write(f,' ');
   write(f,a[i].year);  write(f,' ');
   writeln(f,a[i].telefon);
end;
Close(f);
Reset(f);
surname1:='';
while not EOF(f) Do
begin
  readln(f,year1,telefon1,surname1);
 
  if (year1 >= 1970) and (year1 <= 1980) then begin
    writeln('Nashlos telo s datoj rojdenija 70-80');
    writeln('Ego familia ',surname1);
    writeln('Ego telefon - ',telefon1);
    writeln('________________________________');
  end;
end;
readkey;
end.
                       
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение Sergei I. Gorelkin » 14.12.2006 17:01:46

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

Во-вторых, раз в условии задачи сказано "типизированный файл", значит уместно объявить его типизированным, а именно, содержащим записи типа yeah:

Код: Выделить всё
var
  f: file of yeah;


и потом читать и писать записи типа yeah, при этом порядок полей будет соблюдаться автоматически.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение @lex » 14.12.2006 18:38:21

Код: Выделить всё
uses crt
...
var
f: file of yeah;
rec: yeah;
...
//Так записываем
assign(f,'ggg.dat');
rewrite(f);
blockwrite(f,rec,1);
close(f);
...
//Так читаем
assign(f,'ggg.dat');
reset(f);
blockread(f,rec,1);
close(f);

И никаких проблем! :)
Только если будешь юзать SysUtils, то замени assign и close на assignfile и closefile соответственно.
Поправьте меня, если где-то не прав.
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Сообщение *13* » 14.12.2006 19:32:40

Sergei I. Gorelkin писал(а):Во-первых, раз в файл записываются данные в порядке: фамилия, год, телефон, то и читать их надо в том же порядке. Если пытаться прочитать год с того места, куда записана фамилия - естественно, произойдет ошибка.

Во-вторых, раз в условии задачи сказано "типизированный файл", значит уместно объявить его типизированным, а именно, содержащим записи типа yeah:

Код: Выделить всё
var
  f: file of yeah;


и потом читать и писать записи типа yeah, при этом порядок полей будет соблюдаться автоматически.

я это делал, так как не получалось убрал. вернем сейчас на место.
спасибо уже за то , что откликнулись :roll:
как правильно записать строку через write в ФАЙЛ: фамилия- год рождения- телефон ?
и еще такой вопрос, нужно ли вобще вводить другие переменные чтобы потом в строке найти допустим год рождения, или в файле он както автоматом будет помечен как year и потом нужно будет искать например read(f,year) ? :wink:
извините если вопросы глупые- я не так давно познакомился с паскалем :)
p.s. @lex, зачем мне юзать Блокврайт, это же для нетипизированых файлов. поправьте меня, если я не прав :wink:
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение Lazy » 15.12.2006 10:59:21

Исправденный текст.

program yeeeaah;

{$mode objfpc}{$H+}

uses crt;
const
n=4;
type
yeah = record
surname:string[30];
year:1900..2000;
telefon:111111..7999999;
end;
var
a:array[1..n] of yeah;
f: file of yeah;
filename:string[20];
i:byte;
r: yeah;

begin
writeln('Kakoje bi vi hoteli vibrat imja faila? ( <= 20 simvolov)');
readln(filename);
Assign(f,filename);
Rewrite(f);
writeln('Teper, zapolnite pojalusta fail zapisami po tipu:');
writeln(' - familia (do 30 simvolov)');
writeln(' - god rojdenia (zifra ot 1900 do 2000');
writeln(' - nomer telefona (zifra ot 111111 do 7999999');
writeln(' P.S.');
writeln('Na dannij moment programa podderjivaet ',n,' zapisej v fail');
for i:=1 to n Do
begin
with a[i] Do
begin
readln(surname);
readln(year);
readln(telefon);
end;
write(f,a[i]);
end;
Close(f);
Reset(f);
while not EOF(f) Do
begin
read(f,r);

if (r.year >= 1970) and (r.year <= 1980) then begin
writeln('Nashlos telo s datoj rojdenija 70-80');
writeln('Ego familia ',r.surname);
writeln('Ego telefon - ',r.telefon);
writeln('________________________________');
end;
end;
readkey;
end.
Lazy
незнакомец
 
Сообщения: 8
Зарегистрирован: 11.07.2006 09:59:10

Сообщение Lazy » 15.12.2006 11:07:25

Ошибка в этой строке:

readln(f,year1,telefon1,surname1);

Неправильный порядок переменных, исправление порядка не
поможет ( readln(f,surname1,year1,telefon1)), т.к. вся строка из текстового файла будет прочитана в переменную surname1.
Lazy
незнакомец
 
Сообщения: 8
Зарегистрирован: 11.07.2006 09:59:10

Сообщение drew » 22.12.2006 19:39:34

При работе с типизированными фалами о ReadLn надо забыть. Исполь зуются Read i Write.

так нельзя читать из файла в данном случае:
readln(f,surname1,year1,telefon1));
т.к. файл F является типизированным.

Можно например так:

Read(F, peremennaja); //читаем из файла в peremennaja 1 запись
WriteLn(Peremennaja.surname); //выводим на дисплей

Каким образом вы хотите записать в файл типа Yeah сразу массив ?
Этот код полностью неправильный, требуется тотальный разбор ошибок =)
drew
незнакомец
 
Сообщения: 5
Зарегистрирован: 22.12.2006 11:22:23
Откуда: Рига

Re: Помогите пожалуйста, работа с файлами...

Сообщение VirtUX » 21.08.2009 17:49:31

Есть-ли возможность вставлять/удалять блоки данных в произвольном месте файла, без перезаписи исходного в новый. Мне бекап не нужен.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Помогите пожалуйста, работа с файлами...

Сообщение Sergei I. Gorelkin » 21.08.2009 18:21:44

Можно, при условии что по файлу можно позиционироваться (т.е. решение только для файлов, не расширяемое на сокеты и всякие stdin/stdout).
Ну и часть файла, следующую за изменяемой, все-таки нужно будет куда-нибудь считывать, чтобы потом записать по новому смещению.

Перезапись в новый файл я бы рекомендовал из соображения надежности: случись что во время перезаписи "на месте", данные почти с гарантией будут потеряны.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 3

Рейтинг@Mail.ru