Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2013, 19:54   #1
H4t
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 31
По умолчанию Паскаль. Работа с типизированными файлами.

Дан типизированный файл (файл записей) с данными о посылках: город, улица, дом, квартира, фамилия, ценность. Вывести на экран сведения о посылках. Вывести в типизированные файлы списки посылок по городам.

Код:
uses crt;
type
 post=record
      town: string[10];
      strt:   string[10];
      ndom: integer;
      numb: integer;
      name: string;
      pric:   integer;
end;

const
   PathToFiles = 'C:\Program Files\PABC\';

var ved:post;
    F1, fTown:            file of post;
    sTownFileName,stroka: string;
    i:                    integer;
    s,s2:                    string;
    k:                    integer;
Begin
  Assign(F1,PathToFiles + 'File_1.txt');
  Rewrite(F1);
  
  Writeln(' Вводите данные или CTRL-Z: ');
  while not eof(F1) do begin
   Readln(s2);
   Write(F1,s2);                      //Ввод данных, просто ничего не происходит
  end;
   Writeln;

  Close(F1);
  Reset(F1);

  WriteLn('Содержимое файла: ');
  while not eof(F1) do begin
   with ved do begin
     read(F1, s);
     town := Trim(Copy(s,1,10));
     strt := Copy(s, 11, 10);
     ndom := Copy(s, 21, 4);
     numb := Copy(s, 25, 6);
     name := Copy(s, 32, 3);
     pric := Copy(s, 36, Length(s)-36+1);
     writeln(town,' ', strt, ' ', ndom:5,' ',numb:5,' ',name,' ',pric:5);
     
     sTownFileName:=PathToFiles+trim(town)+'.txt';
     Assign(fTown,sTownFileName);
     if FileExists(sTownFileName)
         then begin
           Rewrite(fTown);
           seek(fTown,filesize(F1));
           Write(fTown,  town,' ', trim(strt), ' ', ndom,' ',numb,' ',trim(name),' ',pric,' ');
           Close(fTown);
         end
         
         else begin
          Rewrite(fTown);
          Write(fTown,  town,' ', trim(strt), ' ', ndom,' ',numb,' ',trim(name),' ',pric,' ');
          Close(fTown);
         end;
   end;
  end;

  Close(F1);
End.
Нужна помощь с решением проблемы - ввод данных не происходит вообще, паскаль будто просто не видит эту часть кода
Т.е. я хочу вводить строки целиком, скопировав их с txt файла допустим и записать их в типизированный файл, после чего программа сама считает оттуда отдельные поля и запишет в другие типизированные файлы списки посылок по городам.
Буду очень благодарен^

Последний раз редактировалось H4t; 19.03.2013 в 20:00.
H4t вне форума Ответить с цитированием
Старый 19.03.2013, 20:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

то, что Вы написали даже НЕ откомплируется!

Код:
var    F1, fTown:            file of post;
....
 read(F1, s);
Вы же создали ТИПИЗИРОВАННЫЙ файл (файл, состоящий из КОМПОНЕНТ == ЗАПИСЕЙ).
строчку нельзя прочитать из этого файла.
должно быть так:
Код:
  Assign(F1,PathToFiles + 'File_1.DAT');
  Reset(F1);  {файл уже создан и заполнен}

  while not eof(F1) do begin
     read(F1, ved);
 
       sTownFileName:=PathToFiles+trim(ved.town)+'.txt';
       Assign(fTown,sTownFileName);
       if FileExists(sTownFileName)
         then begin
           Reset(fTown);
           seek(fTown,filesize(fTown));
           Write(fTown,  ved );
           Close(fTown);
         end         
         else begin
          Rewrite(fTown);
          Write(fTown,  ved);
          Close(fTown);
         end;
  end;

  Close(F1);
end.
код не проверял, писал прямо на форуме!


ну и ещё. Вы явно упускаете из внимания тот факт, что типизированный файл НЕЛЬЗЯ читать/смотреть/изменять в обычном редакторе (блокноте, например)! Это не текстовый, это ДВОИЧНЫЙ файл!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.03.2013, 20:17   #3
H4t
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 31
По умолчанию

Да, я понял ключевую ошибку про запись, т.е. мне нужно еще просто добавить код заполнения исходного файла данными?
H4t вне форума Ответить с цитированием
Старый 19.03.2013, 20:26   #4
H4t
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 31
По умолчанию

Код:
uses crt;
type
 post=record
      town:   string[10];
      strt:   string[10];
      ndom:   integer;
      numb:   integer;
      name:   string;
      price:  integer;
end;

const
   PathToFiles = 'C:\Program Files\PABC\';

var ved:post;
    F1, fTown:            file of post;
    sTownFileName,stroka: string;
    i,n:                  integer;

Begin
  Assign(F1,PathToFiles + 'File_1.txt');
  Rewrite(F1);
  
  Write('Сколько записей вы желаете ввести? ');
  Readln(n);
  
  if n>0 then begin
    Seek( F1, FileSize(F1) );
    for i:=1 to n do begin
      with ved do begin
        Write('Город: '); Readln(town);
        Write('Улица: '); Readln(strt);
        Write('Номер дома: '); Readln(ndom);
        Write('Квартира (число): '); Readln(numb);
        Write('ФИО: '); Readln(name);
        Write('Стоимость поссылки(действительно число):');   Readln(price);

      end;
      Write( F1, ved );
    end;
    Close(F1);
    Reset(F1);
  end;

  while not eof(F1) do begin
     Read(F1, ved);
     sTownFileName:=PathToFiles+trim(ved.town)+'.txt';
     Assign(fTown,sTownFileName);
     if FileExists(sTownFileName) then begin
           Reset(fTown);
           seek(fTown,filesize(fTown));
           Write(fTown,  ved );
           Close(fTown);
     end
     else begin
          Rewrite(fTown);
          Write(fTown,  ved);
          Close(fTown);
     end;
 end;

  Close(F1);
End.

    {Reset(fTown);
  while not eof(fTown) do begin
   with ved do begin
    read(fTown, ved);
    WriteLn(ved.town:18,' | ',ved.strt:15,' | ',ved.name:18,' | ',ved.price:8);
    end;
    end;
    close(fTown);}
Вроде бы так правильно, но чья-то проверка бы не помешала . То, что внизу в комментариях - сделал 3 записи, к примеру city1, city2, city1, просто посмотрел правильно ли записывает 2 города со всеми данными.

Последний раз редактировалось H4t; 19.03.2013 в 20:33.
H4t вне форума Ответить с цитированием
Старый 19.03.2013, 22:58   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да, в целом, нормально.

несколько небольших замечаний (т.к. сказать - "на будущее" ).


1. Вас не смущает, что расширение у исходного типизированного файла Вы ставите .TXT, что принято для текстовых файлов ( хотя ваш файл НЕ текстовый) ?!

2. Вы при каждом запуске перезаписываете файл. И заставляете пользователя заново вводить записи. Это, по крайней мере, утомительно для вас (Вы же для отладки наверняка неоднократно запускали программу) и издевательски по отношению к оператору/пользователю программы. Неужели Вам трудно добавить несколько строчек и, если файл есть - спросить, хочет ли человек его дополнить (или перезаписать)). Впрочем, это, конечно, вопросы "дружелюбности" интерфейса, а не работоспособности кода...

3. тоже не ошибка... но непонятно/неопрятно:
Цитата:
Код:
 post=record
      town:   string[10];
      strt:   string[10];
...
 WriteLn(ved.town:18,' | ',ved.strt:15,' | ',ved.name:18,' | ',ved.price:8);
Если у Вас для города и для улицы в записи отводится по 10 символов, то зачем на экрна выводить 18 символов названия города и 15 символов названия улицы? Нет, если Вы понимаете, что делаете, и выводите так для красоты - то ради Бога, хуже, если Вы не понимаете, что это за циферки после двоеточия..



так что, неплохо, на зачёт ваш код покатит!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.03.2013, 23:51   #6
H4t
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 31
По умолчанию

Поставил расширение .dat уже давно, поленился код на форуме исправлять , про цифры после двоеточия конечно знаю, я даже отступы и оформление стандартное для себя не делал, просто скинул первую рабочую версию кода. А по поводу дружелюбности программы - ну это конечно уже отдельный вопрос, нужна была бы программа для каких-то целей или как конкретная работа, а просто сдать на лайбе сойдет и так . Спасибо.
H4t вне форума Ответить с цитированием
Старый 19.03.2013, 23:56   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, раз так, значит, всё отлично.
Пожалуйста!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с типизированными файлами Макс Башкинов Помощь студентам 25 18.01.2013 11:49
работа с типизированными файлами Ilya1986g Общие вопросы Delphi 2 22.04.2012 21:10
Паскаль. Проблема с типизированными файлами:( Женька Good Помощь студентам 5 07.12.2011 23:41
Работа с типизированными файлами bo-al Помощь студентам 2 27.02.2010 19:18
Работа с типизированными файлами. Darangel Помощь студентам 1 17.05.2009 19:19