Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
1

Сравнение двух текстовых файлов без выгрузки в Memo

21.04.2019, 21:13. Показов 2045. Ответов 19

Author24 — интернет-сервис помощи студентам
Здравствуйте. Стоит задача сравнения двух текстовых файлов. До этого, делал так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
var
a,b:string;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  openDialog : TOpenDialog;    // Переменная OpenDialog
begin
  Memo1.Text:='';
  Edit1.Text:='';
  // Создание объекта OpenDialog - назначение на нашу переменную OpenDialog
  openDialog := TOpenDialog.Create(self);
 
  // Установка начального каталога, чтобы сделать его текущим
  openDialog.InitialDir := GetCurrentDir;
 
  // Только разрешенные существующие файлы могут быть выбраны
  openDialog.Options := [ofFileMustExist];
 
  // Разрешено выбрать только .txt файлы
  openDialog.Filter :='Text files|*.txt';
 
  // Выбор файлов Паскаля как стартовый тип фильтра
  openDialog.FilterIndex := 2;
 
  // Показ диалог открытия файла
  if openDialog.Execute
  then
  begin
   Edit1.Text:=opendialog.FileName;
   Memo1.Lines.LoadFromFile(opendialog.FileName);
   a:=Memo1.Text;
  end
  else ShowMessage('Открытие файла остановлено');
 
  // Освобождение диалога
  openDialog.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  openDialog : TOpenDialog;    // Переменная OpenDialog
begin
  Memo2.Text:='';
  Edit2.Text:='';
  // Создание объекта OpenDialog - назначение на нашу переменную OpenDialog
  openDialog := TOpenDialog.Create(self);
 
  // Установка начального каталога, чтобы сделать его текущим
  openDialog.InitialDir := GetCurrentDir;
 
  // Только разрешенные существующие файлы могут быть выбраны
  openDialog.Options := [ofFileMustExist];
 
  // Разрешено выбрать только .txt файлы
  openDialog.Filter :='Text files|*.txt';
 
  // Выбор файлов Паскаля как стартовый тип фильтра
  openDialog.FilterIndex := 2;
 
  // Показ диалог открытия файла
  if openDialog.Execute
  then
  begin
   Edit2.Text:=opendialog.FileName;
   Memo2.Lines.LoadFromFile(opendialog.FileName);
   b:=Memo2.Text;
  end
  else ShowMessage('Открытие файла остановлено');
 
  // Освобождение диалога
  openDialog.Free;
end;
 
procedure Srav;
begin
  if a=b then
    ShowMessage('Файлы равны')
  else
    ShowMessage('Файлы не равны');
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  a:=Memo1.Text;
  b:=Memo2.Text;
  Srav;
end;
Edit1 и Edit2 - туда загружаются пути к файлам
Memo1, Memo2 - туда загружается содержимое файлов
Всё это делается по кнопкам Button1 и Button2. По нажатию кнопки Button3, вызывается процедура Srav (такова тонкость задания, использовать процедуру), в которые проверяется равенство, фактически Memo1 и Memo2. Задание решено правильно, но попросили использовать немного другой метод, а именно проверить содержимое самих файлов на равенство, а не их выгруженное содержимое в Memo. Как это можно реализовать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2019, 21:13
Ответы с готовыми решениями:

Сравнение двух текстовых файлов
господа есть 2 файла txt как сравнить точно ли информация в первом совпадает со вторым

Сравнение двух текстовых файлов
Объясните, пожалуйста, как работает код #include<iostream> #include <stdio.h> #include...

Сравнение двух текстовых файлов
Добрый вечер! Задачка такая стоит: Сравнить два текстовых файла. Определить одинаковые ли они? То...

Сравнение двух текстовых файлов
Здравствуйте, как реализовать http://www.linuxlib.ru/manpages/COMM.1.shtml с ключом -1 (уникальные...

19
5489 / 4404 / 1077
Регистрация: 29.08.2013
Сообщений: 27,605
Записей в блоге: 3
21.04.2019, 21:17 2
загрузить в 2 TstringList и их сравнить
0
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
21.04.2019, 21:20  [ТС] 3
Цитата Сообщение от qwertehok Посмотреть сообщение
загрузить в 2 TstringList
Фактически мы загрузим их в переменные же? А без них вообще возможно?..
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
21.04.2019, 21:27 4
Цитата Сообщение от Jebvo Посмотреть сообщение
мы загрузим их в переменные же? А без них вообще возможно?
чем переменные не угодили?
0
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
21.04.2019, 21:31  [ТС] 5
Цитата Сообщение от droider Посмотреть сообщение
чем переменные не угодили?
Да не то чтобы не угодили, просто надеялся что как то можно без выгрузки в переменные, или хотя бы минимизировать и использовать одну как буфер, сравнивая по символьно или словами, например. Но если даже это и возможно сделать, я вообще без понятия как
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
21.04.2019, 21:41 6
Jebvo, какие должны быть результаты сравнения? Сообщения "равны/не равны"?
0
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
21.04.2019, 21:44  [ТС] 7
Цитата Сообщение от droider Посмотреть сообщение
Сообщения "равны/не равны"
Именно
0
Злостный нарушитель
9514 / 5158 / 1175
Регистрация: 12.03.2015
Сообщений: 24,315
21.04.2019, 21:52 8
2 TFileStream. Текстовые файлы - это всё равно файлы. В файлах байты. Не надо никаких Memo и StringList: задача - равно или не равно.

Доклад окончил.
1
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
21.04.2019, 21:54  [ТС] 9
Цитата Сообщение от Verevkin Посмотреть сообщение
2 TFileStream
Первый раз слышу об этом... А это разве не вес файлов мы сможем проверить? Надо бы то содержимое
0
Злостный нарушитель
9514 / 5158 / 1175
Регистрация: 12.03.2015
Сообщений: 24,315
21.04.2019, 22:00 10
Цитата Сообщение от Jebvo Посмотреть сообщение
Первый раз слышу об этом...
Самое время лишиться девственности.
Цитата Сообщение от Jebvo Посмотреть сообщение
А это разве не вес файлов мы сможем проверить? Надо бы то содержимое
Не сомневайся, делай, что говорю.
1
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
21.04.2019, 22:40 11
Лучший ответ Сообщение было отмечено Jebvo как решение

Решение

Цитата Сообщение от Jebvo Посмотреть сообщение
Первый раз слышу
тогда Вам лучше так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// процедура проверки
procedure CheckTwoFiles(N1, N2:string);
var
  l1, l2: TStringList;
begin
  l1 := TStringList.Create;
  l2 := TStringList.Create;
  try
    l1.LoadFromFile(N1);  //первый список
    l2.LoadFromFile(N2); // второй список
    if l1.Equals(l2) then ShowMessage('Файлы равны')
    else ShowMessage('файлы различаются');
  finally
    FreeAndNil(l1);
    FreeAndNil(l2);
  end;
end;
 
//пример использования
procedure TForm1.Button1Click(Sender: TObject);
begin
CheckTwoFiles('c:\t1.txt', 'c:\t2.txt');
end;
 
end.

Для справки
Метод
function Equals(Strings: TStrings): Boolean;

возвращает значение True, если элементы списка strings полностью совпадают с элементами данного списка.
Цитата Сообщение от Verevkin Посмотреть сообщение
TFileStream
для ВУЗовской задачи сурово ты с детишками
1
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
21.04.2019, 22:44  [ТС] 12
Цитата Сообщение от droider Посмотреть сообщение
тогда Вам лучше так
Спасибо, научусь заодно использовать TStringList. Если не прокатит, буду читать про TFileStream
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
21.04.2019, 22:46 13
Цитата Сообщение от Jebvo Посмотреть сообщение
Если не прокатит
прокатит
0
Модератор
9611 / 6218 / 2423
Регистрация: 21.01.2014
Сообщений: 26,522
Записей в блоге: 3
22.04.2019, 07:21 14
Цитата Сообщение от Jebvo Посмотреть сообщение
Если не прокатит
Если файлы именно текстовые и если их размер измеряется не в Гигабайтах - тогда прокатит.
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
22.04.2019, 09:20 15
Цитата Сообщение от D1973 Посмотреть сообщение
если их размер измеряется не в Гигабайтах
TStringList can hold up to 134,217,728 strings (MaxListSize+1). There are no limits on the size of the string (other than physical memory limits and processor address space limits)
как-то так
0
1077 / 488 / 316
Регистрация: 05.04.2013
Сообщений: 2,141
22.04.2019, 10:11 16
Цитата Сообщение от Jebvo Посмотреть сообщение
Фактически мы загрузим их в переменные же? А без них вообще возможно?..
а что, если хэш-сумму подсчитать (каждого файла)?
0
Злостный нарушитель
9514 / 5158 / 1175
Регистрация: 12.03.2015
Сообщений: 24,315
22.04.2019, 10:35 17
Цитата Сообщение от AHBAR Посмотреть сообщение
а что, если хэш-сумму подсчитать (каждого файла)?
Этот вариант будет читать оба файла до конца. А побайтное сравнение - до первого несовпадения. Чуешь разницу?
0
1077 / 488 / 316
Регистрация: 05.04.2013
Сообщений: 2,141
22.04.2019, 14:13 18
Цитата Сообщение от Verevkin Посмотреть сообщение
Чуешь разницу?
Чую)
Цитата Сообщение от Verevkin Посмотреть сообщение
побайтное сравнение
как такое лучше (оптимальнее) делать?
1. Оба файла грузить в TStream? (например TMemoryStream) - обрабатываться будет довольно быстро, но, опять таки, - это снова означает "читать оба файла до конца"
2. Побайтно читать байты (тавтология) с помощью AssignFile/Reset/Write. На мой взгляд это медленно
0
Злостный нарушитель
9514 / 5158 / 1175
Регистрация: 12.03.2015
Сообщений: 24,315
22.04.2019, 14:33 19
Цитата Сообщение от AHBAR Посмотреть сообщение
Побайтно читать байты (тавтология) с помощью AssignFile/Reset/Write. На мой взгляд это медленно
Шума шашол? Какой Reset в 2019 году?!
Цитата Сообщение от AHBAR Посмотреть сообщение
Оба файла грузить в TStream? (например TMemoryStream) - обрабатываться будет довольно быстро, но, опять таки, - это снова означает "читать оба файла до конца"
Я бы сделал через TFileStream. Написал бы потомок TThread, который читает в 2 буфера, например, по 1 Мб данных и сравнивает.
Если тебе интересно, напиши тестовую программу с кнопочками/свистеками/перделками, где можно будет все эти параметры настраивать и засекать время выполнения и вычисляет текущую и среднюю скорость.

Я подобную задачу не так давно решал тут. Вот каст:
0
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
27.04.2019, 10:08  [ТС] 20
Цитата Сообщение от droider Посмотреть сообщение
прокатит
прокатило)
0
27.04.2019, 10:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2019, 10:08
Помогаю со студенческими работами здесь

Сравнение двух текстовых файлов.
How to open two files, compare them, and output the file that will contain text that from first...

Сравнение двух текстовых файлов
Имеется 2 файла txt. Нужно сравнить эти файлы.Они почти идентичны, но в начале первого файла есть...

Сравнение двух текстовых файлов
Помогите пожалуйста с прогой) В С# уровень Hello World =( В С# выполнить сравнение двух текстовых...

Сравнение слов из двух текстовых файлов
И к тому же командная строка закрывается сразу после вывода, ни getchar(), ни system("pause") не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru