Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с файлами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
sergey_baltazavr
Ребят, подскажите почему падает?
program file_operation_TWO;
uses crt;

{----------------opisanie peremennux--------------------------------}
type
    tovar = record {opredelyem strukturu dannyx TOVARA}
          name : string;
          cost : real;
          num  : integer;
    end;

var
     F1: file of tovar;
     s : array[0..100] of tovar;
     s1 : tovar;
     c : char;
     mas:array[0..100] of real;
     ch : integer;
     n : integer;
{-------------------------------------------------------------------}




{------------------1-procedura vvoda s klaviatury i zapis v massiv-------------------------}
procedure out_mas;

          begin
               ch:=0;
               writeln('1) Vvod c klaviatury veshestvennyx chisel i zapis v file->>>');
               writeln('');
               repeat
                     write('Input name:   ');
                     readln(s[ch].name);

                     write('Input cost:   ');
                     read(s[ch].cost);

                     write('Input number:   ');
                     readln(s[ch].num);

                     writeln('');
                   {  writeln(s[ch].cost);
                     writeln(s[ch].name);
                     writeln(s[ch].num);
                    } ch:=ch+1;
                     write('Okonchit vvod? y/n:  ');
                     readln(c);
               until c = 'y';
                n:=ch;
                writeln('N=',n);

          end;
{---------------------------------------------------------------------}

{-----------------2-procedura zapisi massiva v file-------------------------}
procedure out_fil;
           var
             file_name : string;
          begin
               file_name:='o123';
               ch:=0;
               assign(F1, file_name);
               rewrite(f1);
               reset(F1);
               writeln('2) Zapis massiva v file->>>');
               writeln('');
               repeat
                     write(F1,s[ch]);
                     ch:=ch+1;

               until ch<n;
          end;
{---------------------------------------------------------------------}


{-------------------3-procedura dopolneniy file--------------------------}
procedure dop_fil;
          var
           file_name : string;
           dstr : string;

           i,code:integer;
 begin
               writeln('');
               writeln('3) Dopolnenie file->>>');
               ch:=0;
               code:=0;
               file_name:='o123';
               assign(F1, file_name);
               reset(F1);
               writeln('Vvedite dannye dly dopolneniy v file: ');
               {---}
               write('Input name:   ');
               readln(s1.name);

               write('Input cost:   ');
               readln(s1.cost);

               write('Input number:   ');
               readln(s1.num);
               {---}
               write(F1,s1);
               close(F1)
  end;
{---------------------------------------------------------------------}



{-------------------4-procedura chteniy iz file i vyvod na ekran------}
procedure in_fil;
          var
           file_name : string;

           i,code:integer;
 begin
               writeln('');
               writeln('4) Chtenie iz file i vyvod na ekran->>>');
               ch:=0;
               code:=0;

               file_name:='o123';
               assign(F1,file_name);
               writeln('qqqqqqqq'); readkey;
               {-----ERRORS!--------}

               {---------------------}
               repeat
                    read(F1,s1);      {padaeettttt!!!!!!}
                    readkey;
                    writeln('Name: ',s1.name);
                    writeln('Cost: ',s1.cost);
                    writeln('Number: ',s1.num);

               until Eof(F1);
          close(F1)
  end;
{---------------------------------------------------------------------}



{------------------------ocnovnay programma-----------------------------}
begin
     {sohranenie dannyx}
      clrscr;

      out_mas;
      readkey;

      out_fil;
      readkey;

      dop_fil;
      readkey;

      in_fil;
      writeln('');
      writeln('Press any key...');
      readkey;

end.

Krjuger
Ну и где здесь " Практика продвинутого программирования".
Вопрос. Вторая процедура,где закрытие файла?.
Затем,Reset открывает файл и устанавливает указатель в начало файла.В итоге каждый раз ты будет добавляя новую строку затирать первую.
Зачем делать Rewrite и следом тут же Reset???(2 процедура)
А падает она у тебя в 4 процедуре потому что assign есть,а где Reset?????Я бы на твоем месте нафиг избавился от всех этих процедур. Твои коментарии не соответствуют дейстительности.Циклы я бы все таки использовал на твоем месте либо For либо while, в зависимости от потребностей.
sergey_baltazavr
Это лаба такая, подскажи ещё как сделать чтобы нормально данные в файл заносились, т.е. без затирания строчки.
IUnknown
sergey_baltazavr

1. У тебя out_fil не корректно написана, условие в until должно быть другим. Если ты введешь один элемент массива - программа просто вылетит, потому что Ch < n не выполнится никогда (изначально Ch = 0, но внутри цикла она увеличивается, и становится равной 1-це. И n = 1 тоже. И как ты хочешь выйти из цикла? Программа занесет в файл все пустые записи из массива S, и когда Ch станет больше чем 100 - просто вылетит). Если же введешь больше одного элемента - то программа запишет в файл ровно одну структуру, увеличит значение ch, и цикл благополучно завершится, так как (1 < 2) - истина... Возможно, ты просто не разобрался в том, как работает repeat/until? Выполнение этого цикла завершается тогда, когда условие становится истинным, а не как у While (выполнять, пока условие истинное, как только стало ложным - выходить из цикла)

Так что, придется записать условие в виде until Ch = N, тогда в файл будет записано ровно столько записей, сколько было введено пользователем

2. С перезаписью файла. Создал файл через Rewrite - сразу, безо всяких Reset-ов пиши в него данные. Записал - закрывай файл обязательно. Только тогда все данные действительно в нем сохранятся.

3. Добавление к существующему файлу: открыл файл, но (перед записью в него) надо еще переместиться в самый конец, чтоб действительно дописывать, а не перезаписывать существующие записи:

Reset(F1);
Seek(F1, FileSize(F1)); { <--- Теперь записываться данные будут после последнего элемента }
...
. Assign не обязателен. Если где-то в программе имя файла уже было связано с файловой переменной, то остальные Assign-ы можно убрать.
sergey_baltazavr
Всем спасибо за решение вопроса smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.