Delphi

Сравнение текстовых файлов

Вот такая ситуация!
Надо сравнить два текстовых файла.
Я посторочно из первого читаю текст.
Затем првоеряю, есть ли строка во втором файле.
Если она есть мне нужно её удалить из второго...
Как бы это можно было сделать?
Или хотя бы, как можно второй файл полсностью прочитать в String
переменную? Чтобы затем удалить с Pos(File2, начало, конец).
Ато в string переменную читается только построчно...
Заранее благодарен...
Попробуй сделать масив строк Array[1..(тут число которое твоя програма можэт максимально обрабатывать(используй константу для удобства))] of string;
или просто Pchar(строка), но я не знаю точно как оно действует..
AnsiStrComp - сравнивает 2 строки с учётом регистра,
AnsiStrIComp - тоже самое, но без учёта регистра...
Модуль - SysUtils.
Если это не то, то используй EOLn и OEF
Думаю разберёшся...
[quote=BR17UY;18126]
Если она есть мне нужно её удалить из второго...
Как бы это можно было сделать?
[quote]
Просто так из текстового файла невозможно удалить строку. Если я привильно понял то ты хочешь удалять строки из второго файла, и если в конце всего цикла во втором файле не останется ни одной строки то файлы идентичны. Но я бы сделал не так. Вот примерный код:
...
var
F1,F2:TextFile;
S1,S2:string;
...
While (not EOF(F1)) and (not EOF(F2)) do
read(F1,S1);
read(F2,S2);
If S1<>S2 then break;
end;
...
есть класс Tstringlist
Код:
var st:Tstringlist; str:string; begin st:=...create; st.loadfromfile(....); ... str:=st.strings[5]; //str = шестая строка файла ... st.savetofile(...);
Пасиб ребят, что не бросили в беде.
Если быть конкретным, то задача такова...
Есть два файла: cmd.txt и syst.txt.
cmd.txt - скачивается из нета, он содержит команды для выполнения.
syst.txt - основной командный файл, из него прога уже читает отфильтрованные команды.
Содержимое cmd.txt:
L www.supersite.ru/files/fils.exe
D www.nnov.ru/files/setup.exe(ссылки чисто для примера)
Содержимое syst.txt:
L www.supersite.ru/files/prog.exe
L www.nnov.ru/files/setup.exe
Как стало наверное понятно, ссылки начинающиеся с буквы L просто дописываются в файл syst.txt
А ссылки начинающиеся с буквы D - должны быть вырезаны из syst.txt
Так как D - это отмена загрузки той или иной ссылки.
Если строка из cmd.txt начинается с буквы D - значит находим ссыку в syst.txt и удаляем её от туда...
Вот собственно и всё!
Но пасиб, что предложили альтернативы, обязательно учту!
так в чём сложность????в чём проблема?
для получения индекса строки есть функция indexOf если результат -1 то не найдена, только надо сначала переправить первый символ
str[1]:='L';
Я с тобой согласен rpy3uH :-)
В общем сложности то и нету... Что-то подсказывает, что наиболее реальным будет использование массивов. Просто пишу содержимое файлов в два массива. Потом анализирую, и либо дописываю в массив, либо игнорирую новые ссылки. А потом переписываю файл syst.txt
Хотя может есть и более грамотное решение поставленной задачи ?
Что-то мне не особо нравится вся эта работа с файловыми переменными, особенно когда компьютер вырубается. Я бы лучше в Edit через Loadfromfile загружал, а потом уже проводил сравнения строк. Тем более файл текстовый. А Edit можно и невидимым сделать.
не Edit, а Memo......
использование memo или stringlist намного лучше
Сообщение от rpy3uH
не Edit, а Memo......
использование memo или stringlist намного лучше
Зачем создавать визуально? Зачем давать нагрузгу компу??? Проще создать виртуальный список, StringList к примеру, а не Memo
tstringlist это родной для delphi способ работы со строками и текстовыми файлами
есть код
procedure ffind(cat:string); //каталог, откуда начать поиск
var sea:TSearchRec;
res:integer; //результат поиска (0 или нет)
begin
res:=FindFirst(cat+'*.*',faAnyFile,sea); //ищем первый файл
res:=findNext(sea);//ищем следующий файл
While res=0 do
begin
if (Sea.Attr=faDirectory) and ((Sea.Name='.')or(Sea.Name='..')) then//чтобы не было файлов . и..
begin
Res:=FindNext(sea);
Continue;//продолжаем цикл
end;
if (Sea.Attr=faDirectory) then//если нашли директорию, то ищем файлы в ней
begin
Ffind(cat+Sea.Name+'');//рекурсивно вызываем нашу процедуру
Res:=FindNext(Sea);//ищем след. файл
Continue;//продолжаем цикл
end;
form1.ListBox1.Items.Add(Sea.Name);//добавляем в Listbox:Tlistbox имя файла
Res:=FindNext(Sea);//ищем след. файл
end;
FindClose(Sea);//освобождаем пересенную поиска
end;
когда меняю *.* на *.mp3 перестаёт искать файлы.
Почему?
боже мой )))
вот держи быстренько наваял:
procedure Mp3Find(Dir: String; List: TStrings);
var
Sr: TSearchRec;
begin
if (Dir[Length(Dir)]<>'') then Dir := Dir + '';
if FindFirst(Dir + '*.*', faAnyFile, SR) = 0 then
repeat
if (Sr.Attr and faDirectory = 0) and
(AnsiUpperCase(ExtractFileExt(Sr.Name))='.MP3') then
{ установлен в маске 0й бит - значит файл }
begin
List.Add(Dir + Sr.Name);
end else
if (Sr.Name<>'.') and (Sr.Name<>'..') then
begin
Mp3Find(Dir + Sr.Name + '', List);
end;
until
FindNext(Sr) <> 0;
FindClose(Sr);
end;
да, но проблема не только в этом, я хочу чтобы искало любой файл, а пример с сменой розшырения я так, просто навёл..( Как чтобы искало любой файл???
ладно, если это так сложно !
procedure Mp3Find(Dir, Ext: String; List: TStrings);
var
Sr: TSearchRec;
begin
if (Dir[Length(Dir)]<>'') then Dir := Dir + '';
if FindFirst(Dir + '*.*', faAnyFile, SR) = 0 then
repeat
if (Sr.Attr and faDirectory = 0) and
(AnsiUpperCase(ExtractFileExt(Sr.Name))=AnsiUpperC ase(ext)) then
{ установлен в маске 0й бит - значит файл }
begin
List.Add(Dir + Sr.Name);
end else
if (Sr.Name<>'.') and (Sr.Name<>'..') then
begin
Mp3Find(Dir + Sr.Name + '', List);
end;
until
FindNext(Sr) <> 0;
FindClose(Sr);
end;
вот суй расширение с точкой в ext !! параметр