Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с записью в файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
klem4
Нужно написать небольшую тему, типа вот этого : http://forum.pascal.net.ru/forum/index.php?showtopic=3845

C записью в массив все отлично! а вот с файлом проблемма, мы не изучали еще, вот даже на простом примере не получается, файл создается, но он пустой!, покажите на этом примере в чем ошибка :

Код
uses crt;
type
   person=record
   name : string;
          end;

var     p : person;
  file_p : file of person;

Begin
  clrscr;
  assign(file_p,'file_p.dat');
  rewrite(file_p);
  with p do
   begin
      writeln('name=');
      readln(p.name);
      close(file_p);
   end;
readln;
end.


Спасибо.
volvo
klem4
Ты описал файл как
Код
file_p: file of person;
и даже не пытаешься в него ничего записать... Вот так:
Код
uses crt;
type person=
 record
   name : string;
 end;

var
 p : person;
 file_p : file of person;

Begin
 clrscr;
 assign(file_p,'file_p.dat');
 rewrite(file_p);
 
 writeln('name=');
 readln(p.name);
 write(file_p, p)

 close(file_p);
readln;
end.


P.S. А что, в ФАКе нет материалов по работе с файлами?
Я же выкладывал... Файлы
klem4
Спасибо, Volvo.

Цитата
P.S. А что, в ФАКе нет материалов по работе с файлами?
Я же выкладывал... FAQ: Файлы



Не нашел я этого, плохо искал smile.gif
Щас почитаю.
klem4
С записью разобрался, теперь проблемы со чтением sad.gif((

FAQ читал, просмотрел множество задач, но ничего не получается sad.gif

процедура output работает, но не верно, выдает какую-то ерунду,
Допустим ввожу
1) vasa
...

2) dima
...

3) peta
...

А выдает
1) vasa
2) vasa
3) dima
4) dima
5) peta

не могу понять как это все долно быть устроено :fire:

Заранее спасибо.

Код
program DataBase;
uses crt;
const n=30;
type
   STUD=record

          NAME1 : string; {Имя}
          NAME2 : string; {Фамилия}
          NAME3 : string; {Отчество}
          DOB   : string; {Дата рождения}
          HT    : string; {Домашний телефон}
          MT    : string; {Мобильный телефон}
          EMail : string; {E-mail адрес}
          ICQ   : string; {Номер ICQ}

        end;

var
      s : stud;
  i,all : byte;
  studs : array[1..n] of stud;
 EndRec : boolean;
 file_s : file of stud;

{-------------------------------------------------}

procedure search;
var nfind:byte;
   lastname:string;
   SearchPoint:boolean;
Begin
  clrscr;
  writeln('Введите Фамилию для поиска :');
  readln(lastname);
  SearchPoint:=false;
  i:=1;
  nfind:=0;
  while (i<=all)and(not(SearchPoint)) do
   begin
      s:=studs[i];
      with s do
       if name2=lastname then
       begin
           nfind:=i;
           SearchPoint:=True;
        end;
      inc(i);
   end;
   writeln('nfind=',nfind);
end;

{-------------------------------------------------}

procedure output;
Begin
  assign(file_s,'Data.dat');
  reset(file_s);
  i:=1;
  while (not(eof(file_s))) do
   begin
      read(file_s,s);
      with s do
       begin
          writeln(i,'-й студент :');
          write('ФИО : ');writeln(name2,' ',name1,' ',name3);
          write('Дата рождения :');writeln(dob);
          write('Домашний телефон :');writeln(ht);
          write('Мобилный телефон :');writeln(mt);
          write('ICQ : ');writeln(icq);
          write('E-mail :  ');writeln(email);
          writeln;
          inc(i);
       end;
   end;
end;

{-------------------------------------------------}

procedure if_next;
var ch:char;
Begin
  writeln('Будете вводить еще студента [Y/N] ?');
  repeat
   ch:=readkey;
  until (ch in ['Y','y','N','n']);
  clrscr;
  if ch in ['Y','y'] then
   begin
      write(file_s,s);
      inc(i);
      inc(all);
      EndRec:=true;
   end
    else
     begin
        close(file_s);
        exit;
     end;
end;

{--------------------------------------------------}

Begin
  clrscr;
  output;
  {assign(file_s,'Data.dat');
  rewrite(file_s);
  i:=1;
  all:=1;
  EndRec:=true;
  while (i<=n)and(EndRec) do
   with s do
    begin
       writeln('Введите информацию для ',i,'-го студента');
       write('Введите Имя : ');readln(name1);
       write('Введите Фамилию : ');readln(name2);
       write('Введите оочество :');readln(name3);
       writeln('Введите дату рождения');
       readln(DOB);
       writeln('Введите номер домашнего телефона');
       readln(HT);
       writeln('Введите номер мобильного телефона');
       readln(MT);
       writeln('Введите E-mail адрес');
       readln(EMail);
       writeln('Введите номер ICQ');
       readln(ICQ);
       studs[i]:=s;
       write(file_s,s);
       EndRec:=false;
       if_next;
    end;}
End.
volvo
klem4
У меня глюки, или я прав? Смотри, что происходит... В основной программе:
Код
while (i<=n)and(EndRec) do
 with s do
   begin
     ...
     studs[i]:=s;
     write(file_s,s); { Я вот об этом }
     ...
   end;

Но в то же время:
Код
procedure if_next;
var ch:char;
Begin
 ...
 if ch in ['Y','y'] then
   begin
     write(file_s,s); { Еще раз ??? }
     ...
   end
 ...
end;

Значит откуда-нибудь вызов Write(file_s, s) надо убрать. :yes:

P.S. А почему
Код
repeat
 ch:=readkey;
until (ch in ['Y','y','N','n']);

а не так:
Код
repeat
 ch:=upcase(readkey);
until (ch in ['Y','N']);
;)
klem4
Цитата
У меня глюки, или я прав? Смотри, что происходит... В основной программе:


Не может быть! она заработала!!! это я видимо когда эксперементировал, забыл, write в разных местах ставил и забыл убрать smile.gif[

Цитата
P.S. А почему

Код

repeat
ch:=readkey;
until (ch in ['Y','y','N','n']);


а не так:


Код

repeat
ch:=upcase(readkey);
until (ch in ['Y','N']);




Потомучто upcase(readkey) мне до этого момента было неизвестно smile.gif

Спасибо, Volvo. А я уж и не знал что и подумать.. а все из-за невнимательности...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.