Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ Сравнение текстовых файлов
Автор: 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
Цитата
А что такое компонент текстового файла?
Цитата
Строка
на уровне стандартных Паскалевских средств да, но вобще-то числа
(каждое число интерплитируется как код ASCII).
Цитата
Больше всего непонятно как определить номер строки в файле?
xds точно сказал - читаешь файл построчно, (цикл) так, что при каждой итерации, увеличивать счетчик...
строку читай процедурой readln а не read
Автор: volvo 2.12.2004 21:07
Oleg_Z
Цитата
строку читай процедурой writeln а не write
Вообще-то, строка читается ReadLn :p2:
точно
Автор: Altair 2.12.2004 21:12
:p2:
Автор: 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).
Ну, выпендрился
Код
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
Цитата
Ну, выпендрился
старался из всех сил для тебя выпендрится
;)
Автор: 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.