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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2012, 16:46   #1
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию Паскаль. Динамические переменные

Уважаемые программисты. Написал код, для программы, которая сравнивает содержимое двух текстовых файлов, обязательно с использованием динамических переменных. Программа работает, но если например указать путь к несуществующему файлу, то все слетает в тар-тарары. Подскажите как быть и что исправить. Я попытался это предусмотреть не безрезультатно...
Вот код:
Код:
program two_files;

uses
  DOS;

type
  tp = ^tr;
  tr = record
    I: string;
    P: tp;
  end;


var
  p1, p2: tp;
  f1, f2, q: text;
  a, b, check: boolean;
  inp_1, inp_2: string;

procedure inputtrace(var f: text; var FileName: string; var Exist: boolean);
var
  v: string;
  sup, code: integer;
begin
  repeat
    repeat
      writeln('Введите имя файла');
      readln(FileName)
    until(FileName <> '');
    begin
      assign(f, FileName);
      exist := true;
      {$i-}
      reset(F);
      {$i+}
      if ioresult <> 0 then
      begin
        writeln('Файл не найден ');
        repeat
          writeln('Нажмите клавишу 1 - выход из программы, 2 - повторить ввод имени файла*');
          readln(v);
          val(v, sup, code);
          if sup = 1 then exist := false;
          if sup = 2 then exist := true;
        until (sup = 1) or (sup = 2);
      end;
    end;
  until (ioresult = 0) or (exist = false);
end;


procedure formochered(FileName: string; var p1: tp; var f: text );
var
  t1, t2: tp;
begin
  new(t1);
  readln(f, t1^.I);
  t1^.p := nil;
  p1 := t1;
  while not eof(f) do
  begin
    new(t2);
    readln(f, t2^.I);
    t2^.p := nil;
    t1^.p := t2;
    t1 := t2;
  end;
  close(f);
end;



function sravnenie(p1, p2: tp ): boolean;
var
  s1, s2: tp;
  EqFiles: boolean;
begin
  EqFiles := true;
  s1 := p1; s2 := p2;
  
  while (s1 <> nil) and (s2 <> nil) do
  begin
    if s1^.I <> s2^.I then  EqFiles := false;
    s1 := s1^.p;
    s2 := s2^.p;
  end;
  if (s1 <> nil) xor (s2 <> nil) then EqFiles := false;
  sravnenie := EqFiles;
end;


procedure itogname(var F: text);
var
  S: PathStr;
  file_name: string;
  z, code: integer;
  qr: string;
begin
  repeat
    writeln('Введите имя для сохранения файла');
    readln(file_name);
    S := FSearch(file_name, '');
    if S <> '' then
    begin
      writeln('Файл с таким именем уже существует');
      repeat
        writeln('Нажмите 1 для нового имени или 2 для перезаписи в файл');
        readln(qr);
        val(qr, z, code);
      until (z = 1) or (z = 2);
      if z = 1 then file_name := '';
    end;
  until file_name <> '';
  assign(f, file_name);
  rewrite(f);
end;

begin
  inputtrace(f1, inp_1, a);
  if check then
    formochered(inp_1, p1, f1);
  inputtrace(f2, inp_2, b);
  if check then
    formochered(inp_2, p2, f2);
  itogname(q);
  if sravnenie(p1, p2) then writeln(q, 'Содержимое одинаково')
  else writeln(q, 'Содержимое различно');
  
  close(q);
  writeln('Результат сохранен в указанный вами файл');
  readln;
end.
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 31.03.2012, 18:24   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Код:
if FileExists(fileName) then
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 31.03.2012, 21:12   #3
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Rin...я пишу в BP а вы мне даете процедуру для pascal abc, тогда мне половину кода переделывать придется...
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 31.03.2012, 21:25   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Rin...я пишу в BP а вы мне даете процедуру для pascal abc, тогда мне половину кода переделывать придется...
а почему не хотите воспользоваться методом, которым Вы же пользуетесь в процедуре itogname ?!
Код:
   readln(file_name);
    S := FSearch(file_name, '');
    if S <> '' then
    begin
      writeln('Файл с таким именем уже существует');
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.03.2012, 21:28   #5
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

я понимаю что ошибка где-то в процедуре inputtrace...но как там использовать fsearch?
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 31.03.2012, 23:52   #6
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Код:
procedure inputtrace(var f: text; var FileName: string; var Exist: boolean);
var
  v: string; Err:boolean;
  sup, code: integer;
begin
  repeat
    repeat
      writeln('Введите имя файла');
      readln(FileName)
    until(FileName <> '');
    begin
      assign(f, FileName);
      exist := true;
      {$i-}
      reset(F);
      {$i+}
      Err:=IOResult<>0; 
      if Err then
      begin
        writeln('Файл не найден ');
        repeat
          writeln('Нажмите клавишу 1 - выход из программы, 2 - повторить ввод имени файла*');
          readln(v);
          val(v, sup, code);
          if sup = 1 then exist := false;
          if sup = 2 then exist := true;
        until (sup = 1) or (sup = 2);
      end;
    end;
  until not(Err) or (exist = false);
end;
...
Begin
  inputtrace(f1, inp_1, a);
  if a then
   begin
     inputtrace(f2, inp_2, b);
     if b then
      begin
       formochered(inp_1, p1, f1);
       formochered(inp_2, p2, f2);
       itogname(q);
       if sravnenie(p1, p2) then writeln(q, 'Содержимое одинаково')
        else writeln(q, 'Содержимое различно');
       close(q);
       writeln('Результат сохранен в указанный вами файл')
      end;
    end;
  readln
end.
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 01.04.2012, 10:31   #7
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Step_UA, спасибо огромное выручили, а то я вчера таки бросился под fsearch переделывать и совсем запутался, блин немного прискорбно что сам не догадался...спасибо за показанный прием)
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 01.04.2012, 10:36   #8
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

если есть try except то можно с помощью них проверить,но если есть!
Кольша вне форума Ответить с цитированием
Старый 01.04.2012, 13:27   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В ВР по-моему обработка исключений еще не появилась.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.04.2012, 20:22   #10
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Кольша,Stilet...да, действительно в bp нету этого, но в любом случае теперь еще и такой метод знаю...спасибо еще раз)...больше знаешь-проще жить
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
«Динамические переменные языка Паскаль. Указатели» Anton94.by Паскаль, Turbo Pascal, PascalABC.NET 6 14.05.2012 01:44
Паскаль. Динамические переменные Pepsik Помощь студентам 4 15.07.2011 06:33
Динамические переменные Desha Помощь студентам 8 07.09.2009 18:36