Помощь - Поиск - Пользователи - Календарь
Полная версия: Сравнение текстовых файлов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Moony
такая вот задачка, помогите пожалуйста с решением

Даны два текстовых файла. Определить, совпадают ли компоненты первого файла с компонентами второго файла, ели нет, то получить номер строки и позицию символа в этой строке, начиная с которого файлы отличаются между собой. В случае, когда один из файлов повторяет начало другого (более длинного) файла, ответом должно быть соответствующее сообщение с указанием имени длинного файла и номера первой строки, которая не входит в короткий файл.
GoodWind
Moony, что-нибудь уже сделано ?
ShadowWatcher
А что такое компонент текстового файла?
xds
Строка ;)
ShadowWatcher
Тогда брутфорса должно вполне хватить...
Moony
Если не трудно напишите алгоритм решения к задачи ну или код. :p2:

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

Последовательно читать строки и увеличивать счетчик.
Altair
Цитата
А что такое компонент текстового файла?

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

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

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

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

Вообще-то, строка читается ReadLn :p2:
точно smile.gif
Altair
:p2: rolleyes.gif
Moony
ReadLn прочитает 1-ую строку из файла, а как перейти к следующей т.е. ко 2-ой?
volvo
Moony
ReadLn будет читать строки, пока есть что читать:
Код

while not EOF(f) do
 ReadLn(f, s)
ShadowWatcher
Цитата
на уровне стандартных Паскалевских средств да, но вобще-то числа  (каждое число интерплитируется как код 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
Цитата
Ну, выпендрился

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

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

Текстовый файл может быть в MBCS - в этом случае далеко не каждое число интерпретируется как код ASCII (таких чисел вообще может не быть) ;)
Moony
А как можно решить задачу без использования Break'а ?
volvo
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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.