На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья! Поздравляем вас с Новым 2025 годом!

Всем удачи, успеха и благополучия!

msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Удаление и вставка строк в файл
    Помогите разобраться с задачей!!
    есть файл из него надо удалить 3 строки зная 1 а после этого вставить в этот
    же файл (удал)1 строку и измененные 2 и 3. HELP! ???
    я сделал ее но когда я начинаю вставлять заного 1 строку он
    впереди нее ставит 13 символов :((
    Сообщение отредактировано: vot -
      Ну и где текст программы? Тут телепатов нема. :)
        Вот это текст delete
        ExpandedWrap disabled
          procedure delet(rec:string;tr:string);
          var
          frr:text;
          fr,fr2:text;
          nsr,sr,sr2:string;
          begin
          if zagryzka2(rec,tr)=false then {это проверка нахождение строки rec в файле tr}
          begin
          writeln();
          end;
          nsr:=tr;
          delete(nsr,6,4);{у всех имен файлов по 5 букв и +3}
          sr2:=nsr;
          nsr:=nsr+'.BAK';
          assign(frr,tr);
          writeln(sr2,nsr);
          readln;
          assign(fr2,nsr);
          rewrite(fr2);
          reset(frr);
          while not eof(frr) do
          begin
          readln(frr,sr);
          writeln(fr2,sr);
          end;
          close(frr);
          close(fr2);
          erase(frr);
          assign(fr2,nsr);
          assign(fr,tr);
          rewrite(fr);
          reset(fr2);
          while not eof(fr2) do
          begin
          readln(fr2,sr);
          if sr=rec then
          begin
          readln(fr2);
          readln(fr2);
          end
          else
          writeln(fr,sr);
          end;
          close(fr);
          close(fr2);
          end;
          Кошмар, у тебя не программа, а китайская грамота :)) без обид :)))))
          А можно поподробнее, что с файлом нужно сделать ?
          Если я правильно понял, то тебе надо найти в нём какую то строку, и после неё поменять две последующие строки на другие (или на их же, только немного изменённые) ?
          А как нужно изменить строки ? На что менять ? Эти две новые строки должны передаваться как параметры к твоей процедуре Delete (в месте с строкой, коротую искать) ?
            Профессор, а нельзя ли получше объяснить, а то я чего-то не понял в условии??
            Напиши чего ты конкретно хочешь!
              Лано я не профессор но попытаюсь объяснить
              Зада в том что :
              есть файл из него надо удалить 3 строки зная 1ую строку!
              delet(x,xx);
              x-содержание 1 строки(а след 2 идут сразу после 1!!)
              xx-название файла
              а вот когда я начинаю применять функцию delet
              происходит
              я помоему все испробовал !!
              ExpandedWrap disabled
                assign(fdd,'xx');
                {$I-}
                append(fdd);
                {$I+}
                if ioresult<>0 then
                begin
                rewrite(fdd);
                end;
                if zagryzka2(s,'xx')=false then{see up}
                begin
                writeln(fdd,s);
                writeln(fdd,s2);
                writeln(fdd,s3);
                end
                else
                begin
                zagryzka(s,'xx');{это функция дастоет по s потом 2 потом 3(s-первая строка)}
                delet(s,'xx');{это оно и есть!}
                {хотя s=s!!100%} ??? ???
                writeln(fdd,s);{вот тут загвоздка вместо s будет 13символов +s} ??? ???
                writeln(fdd,a);{integer}
                writeln(fdd,s3+c);{integer}
                end;
                close(fdd);

              а вот тут задача в том чтобы открыть файл и узнать если в нем строка s
              если есть то удалить ее и 2 посл строки и
              добавить 1стр и 2стр без измен и 3стр с измен(точто было + точто в c)!!!
              если нету то просто записать 1 2 3 введ выше!!
                ДОКТОР !!!
                1. Процедуры delet не существует в природе, как и не существует в природе процедуры, которая одним махом удаляла бы определённые строки из файла.
                2. Уже существующий файл открывают не assign;append;rewrite, а assign;reset для чтения, assign;append для добавления строк в конец, assign;rewrite для полной перезаписи!

                Я всё равно не понял... зачем удалять первые две строки, если их надо записать обратно без изменений? :D :D :D

                Удаляются строки из файла путём последовательного чтения и записи в другой файл, пропуская те строки, которые надо удалить.
                  Ну если просто нужно удалить из файла три строки, начиная с известной, то:
                  ExpandedWrap disabled
                    procedure DelString(FileName,StringToDelete:String);
                    var
                      f1,f2:text;
                      s:string;
                    begin
                      assign(f1,FileName);
                      assign(f2,'temp.dat');
                      reset(f1);
                      rewrite(f2);
                      while not eof(f1) do
                      begin
                        readln(f1,s);
                        if s<>StringToDelete then writeln(f2,s) else
                        begin
                          readln(f1); {Читаем ещё две лишние строки}
                          readln(f1);
                        end;
                      end;
                      close(f1);
                      close(f2);
                      erase(f1);
                      rename(f2,FileName);
                    end;
                    JIN X если ты посмотришь выше то увидешь(2 moe soobshenie) процедуру delet  :D
                    извини запарил с написанием за 1 строкой удал не 2 последних а 2 последующих!!!
                    да насчет rewrite reset append я все знаю поэтому там так и написано:
                    если файл есть то append
                    если нет то rewrite  ;D
                    да ну так все таки почему добовляються 13 символов(смотри мое сообщ выше)
                    да и что за ошибка?
                    This error is reported if an invalid file
                    handle is passed to a DOS system call.

                    This error should never occur; if it does, you
                    know that the file variable is somehow
                    trashed.  ??? ???
                      А мои посты ты игнорируешь ? :(
                        нет я ни кого не игнорирую !
                        sorry
                        так всетки как мне ее испраить????
                          Тогда чем тебе не нравится тот вариант, который я написал ???
                          Я не правильно понял условие ?
                          Jin-X правильно говорит, твою задачу нужно реализовывать открывая два файла, один на запись, другой на чтение, и читая из одного вписывать в другой все строки кроме трёх ненужных. Мой вариант именно так и делает. Это единственный нормальный способ решения такой задачи, и с любой точки зрения самый правильный. Можно конечно попробовать сделать так, как пытаешься сделать ты, но ведь это то же самое, что скажем вместо массива из 100 элементов объявлять 100 переменных и работать с ними. Можно, но не нужно :))))
                          Тоесть я всё веду к тому, что может твой вариант и можно исправить, но он такой запутанный, и .. мм.. как бы это сказать, чтоб не обидеть - нелогично написанный, что лучше постарайся понять тот вариант, что советуем тебе я и Jin-X.
                          [right]С наилучшими пожеланиями Some1 & Jin-X[/right]
                          Сообщение отредактировано: Some1 -
                            понимаешь то что ты написал программу ето хорошо но пойми
                            что это тоже самое что моя функция delet !!!!
                            токо переменные другие!!!
                            а мне надо вот что !!!
                            а вот тут задача в том чтобы открыть файл и узнать если в нем строка s
                            если есть то удалить ее и 2е последующие строки и  
                            добавить 1стр и 2стр без измен и 3стр с измен(точто было + точто в c)!!!
                            я сделал так 1- ищу если строка(х) в файле!
                            если есть то я запоминаю х и после нее 2 строки
                            потом удаляю их
                            и записываю в конец с изменениями 3 стороки!
                            а если нету то просто загружаю 3 введенные строки
                            сам етот кусок проги я написал смотри выше!!!!!!
                            если нету то просто записать 1 2 3 введ выше!!
                            так все таки в чем тут проблема ?
                            и почему после удаления в начало файло записываеться 13 символов?
                            да и если не сложно ответить что за ошибка?
                            This error is reported if an invalid file
                            handle is passed to a DOS system call.

                            This error should never occur; if it does, you
                            know that the file variable is somehow
                            trashed. ??? ???
                              Ладно.
                              Ищем в файле строку StringToDelete, и если находим, то флаг found устанавливаем в паравду, и запоминаем две последующие строки, без записи во второй файл.
                              После выполнения цикла "while not eof(f1) do" флаг found будет равен true только в одном случае - если в файле была найдена строка StringToDelete. И в конце алгоритма, если так и произошло, то в конец второго файла мы добавим, как ты говоришь первую и вторую строки без изменения, и третью плюс c.
                              У тебя нигде не написано, что за c такое, и я так понял оно у тебя известно по условию, поэтому я модифицировал процедуру так, чтобы c передавалась ей в качестве параметра.
                              ExpandedWrap disabled
                                procedure DelString(FileName,StringToDelete:String;C:TypeOfC);
                                var {Я не знаю, какого типа C - string, или char, поэтому написал C:TypeOfC}
                                  f1,f2:text;
                                  s,s2,s3:string;
                                  found:boolean;
                                begin
                                  assign(f1,FileName);
                                  assign(f2,'temp.dat');
                                  reset(f1);
                                  rewrite(f2);
                                  found:=false;
                                  while not eof(f1) do
                                  begin
                                    readln(f1,s);
                                    if s<>StringToDelete then writeln(f2,s) else
                                    begin
                                      found:=true;
                                      readln(f1,s2); {Запоминаем ещё две лишние строки}
                                      readln(f1,s3);
                                    end;
                                  end;
                                  close(f1);
                                  if found then {Если мы нашли строку, StringToDelete то добавим в конец файла...}
                                  begin
                                    writeln(f2,StringToDelete);
                                    writeln(f2,s2);
                                    writeln(f2,s3+c);
                                  end;
                                  close(f2);
                                  erase(f1);
                                  rename(f2,FileName);
                                end;
                              Сообщение отредактировано: Romtek -
                                Цитата
                                This error is reported if an invalid file
                                handle is passed to a DOS system call.

                                This error should never occur; if it does, you
                                know that the file variable is somehow
                                trashed.
                                Это значит:
                                Цитата
                                Эта ошибка возникает если неверная внутренняя переменная, связанная с файлом была передана системному вызову DOS.

                                Эта ошибка не должна никогда появляться. Если она всё же появилась, то даёт тебе знать о том, что переменная, связанная с файлом каким то образом была повреждена.

                                Мораль сей басни такова - если у тебя появилась такая ошибка, то значит у тебя программа написана настолько некорректно, что портит содержимое переменных, таких как f1,f2,f3:text.
                                Сообщение отредактировано: Some1 -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0458 ]   [ 15 queries used ]   [ Generated: 15.01.25, 08:08 GMT ]