Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Сравнение текстовых файлов

Автор: Moony 1.12.2004 1:09

такая вот задачка, помогите пожалуйста с решением

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

Автор: GoodWind 1.12.2004 1:16

Moony, что-нибудь уже сделано ?

Автор: ShadowWatcher 1.12.2004 15:05

А что такое компонент текстового файла?

Автор: xds 1.12.2004 15:28

Строка ;)

Автор: ShadowWatcher 1.12.2004 15:52

Тогда брутфорса должно вполне хватить...

Автор: Moony 2.12.2004 20:20

Если не трудно напишите алгоритм решения к задачи ну или код. :p2:

Больше всего непонятно как определить номер строки в файле?

Автор: xds 2.12.2004 20:22

Цитата
Больше всего непонятно как определить номер строки в файле?

Последовательно читать строки и увеличивать счетчик.

Автор: Altair 2.12.2004 21:05

Цитата
А что такое компонент текстового файла?

Цитата
Строка 

smile.gif
на уровне стандартных Паскалевских средств да, но вобще-то числа smile.gif (каждое число интерплитируется как код ASCII). smile.gif

Цитата
Больше всего непонятно как определить номер строки в файле?

xds точно сказал - читаешь файл построчно, (цикл) так, что при каждой итерации, увеличивать счетчик...
строку читай процедурой readln а не read

Автор: volvo 2.12.2004 21:07

Oleg_Z

Цитата
строку читай процедурой writeln а не write

Вообще-то, строка читается ReadLn :p2:
точно smile.gif

Автор: Altair 2.12.2004 21:12

:p2: rolleyes.gif

Автор: Moony 2.12.2004 22:26

ReadLn прочитает 1-ую строку из файла, а как перейти к следующей т.е. ко 2-ой?

Автор: volvo 2.12.2004 22:28

Moony
ReadLn будет читать строки, пока есть что читать:

Код

while not EOF(f) do
 ReadLn(f, s)

Автор: ShadowWatcher 2.12.2004 22:30

Цитата
на уровне стандартных Паскалевских средств да, но вобще-то числа  (каждое число интерплитируется как код ASCII).

Ну, выпендрился smile.gif

Код

Var
 f1,f2:Text;
 s1,s2:String;
 i,n:Integer;
 bNotified:Boolean;
Begin
 Assign(f1,'c:\f1.Txt');Reset(f1);
 Assign(f2,'c:\f2.Txt');Reset(f2);
 bNotified := False;
 n := 1;
 While Not (Eof(f1)) Do
 Begin
   If (Eof(f2)) Then
     Break;
   ReadLn(f1,s1);
   ReadLn(f2,s2);
   If (s1<>s2) Then
   Begin
     For i:=1 To Length(s1) Do
       If (i > Length(s2)) Or (s1[i]<>s2[i]) Then
         Break;
     WriteLn('String #',n,' Character#',i);
     bNotified := True;
     Break
   End;
   Inc(n)
 End;
 If Not bNotified Then
   If Eof(f1) And Not Eof(f2) Then
     WriteLn('f2 is longer than f1. f1 consists only ',n,' strings')
   Else
     If Eof(f2) And Not Eof(f1) Then
       WriteLn('f1 is longer than f2. f2 consists only ', n ,' strings')
     Else
       WriteLn('Files Are Equal');
 Close(f1);
 Close(f2);
 ReadLn
End.


Вроде так...

Автор: Altair 3.12.2004 1:35

Цитата
Ну, выпендрился

старался из всех сил для тебя выпендрится smile.gif;)

Автор: xds 3.12.2004 8:00

Oleg_Z, числа - компонент любого файла. Текстовый файл - файл, поделённый некоторым образом на последовательности символов (чисел) - строки.

Цитата
каждое число интерплитируется как код ASCII

Текстовый файл может быть в MBCS - в этом случае далеко не каждое число интерпретируется как код ASCII (таких чисел вообще может не быть) ;)

Автор: Moony 11.12.2004 22:07

А как можно решить задачу без использования Break'а ?

Автор: volvo 11.12.2004 22:30

Moony
А оно тебе надо? Если надо, то учти, что добавляются еще 2 переменные:

Код
Var
 f1,f2:Text;
 s1,s2:String;
 i,n:Integer;
 bNotified:Boolean;
 ToContinue, nonStop: Boolean;
Begin
 Assign(f1,'f1.Txt');Reset(f1);
 Assign(f2,'f2.Txt');Reset(f2);
 bNotified := False;
 n := 1; ToContinue := True;
 While ToContinue and (not Eof(f1)) Do
   Begin
     If Eof(f2) Then ToContinue := False
     Else
       Begin
         ReadLn(f1,s1);
         ReadLn(f2,s2);
         If s1<>s2 Then
           Begin
             i := 1; nonStop := True;
             While nonStop and (i <= Length(s1)) Do
               Begin
                 If (i > Length(s2)) Or (s1[i]<>s2[i])
                   Then nonStop := False;
                 Inc(i, Byte(nonStop))
               End;
             WriteLn('String #',n,' Character#',i);
             bNotified := True;
             ToContinue := False
           End;
         Inc(n, Byte(ToContinue))
       End;
   End;
 If Not bNotified Then
   If Eof(f1) And Not Eof(f2) Then
     WriteLn('f2 is longer than f1. f1 consists only ',n,' strings')
   Else
     If Eof(f2) And Not Eof(f1) Then
       WriteLn('f1 is longer than f2. f2 consists only ', n ,' strings')
     Else
       WriteLn('Files Are Equal');
 Close(f1);
 Close(f2);
 ReadLn
End.