Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сравнить 2 файла в С++

62K
13 августа 2010 года
Aleksey M.
5 / / 12.08.2010
Здравствуйте. Нужно сравнить содержание двух файлов построчно(если точнее, то по словам). Пробелы, табуляция, знаки препинания, регистры и прочее не учитываются, важны только слова. На выходе необходимо сказать какие строчки различаются, в идеале даже вывести эти слова(но не обязательно):)

Хотелось бы выслушать ваши предложения, как это всё в программе лучше организовывать? Не могли бы вы подробно рассказать, так как с таким раньше дела не имел вообще, да и программирую на с++ недавно(перешёл с basic'a c pascal'ем).

Сам я хотел считывать оба файла построчно(не знаю, можно ли это делать в с++), удалять всё, кроме букв и одного пробела между словами(методом распознавания по ascii коду символа к чему он относится, так как другого способа не знаю), преобразовывать все буквы в строчные и дальше уже сравнивать строки посимвольно и искать есть ли различия.

Может есть более легкий способ это реализовать? Подскажите, пожалуйста))
2.1K
13 августа 2010 года
Norgat
452 / / 12.08.2009
Цитата:
Здравствуйте. Нужно сравнить содержание двух файлов построчно(если точнее, то по словам).



можно. нужно использовать STL(Standart Template Library).
а конкретно классы string (для хранения строк), ifstream - для чтения из файла.

у объекта класса ifstream есть метод getline(). смысл думаю понятен.
примеров чтения строк из файла с использованием ifstream и getline() на форуме выше крыши(лично я точно уже приводил и возможно не один раз).

по поводу сравнения без учёта регистра, вот пример кода:

Код:
#include <iostream>
#include <string>
#include <utility>
#include <conio.h>

using namespace std;

void main()
{
    string str1 = "HELLO";
    string str2 = "hello";
    cout << "str1: " << str1 << endl;
    cout << "str2: " << str2 << endl;

    string::const_iterator i1 = str1.begin(), i2 = str2.begin();

    cout << "result compare: ";
    if(toupper(*i1) == toupper(*i2))
        cout << "true" << endl;
    else
        cout << "false" << endl;
    _getch();
}


по поводу пробельных символов юзай поиск тут же на форуме(это 100% есть, но поиск юзай сам, надо же и тебе что то сделать;) + гугл ест. там тоже выдаётся оч. приличная ссылка на RSDN в самом начале списка линков... дерзай)
5
13 августа 2010 года
hardcase
4.5K / / 09.08.2005
Задача автора сводится к поиску наибольшей общей подпоследовательности.
2.1K
13 августа 2010 года
Norgat
452 / / 12.08.2009
Цитата: hardcase
Задача автора сводится к поиску наибольшей общей подпоследовательности.



не думаю что стоит сводить всё к этой задаче... там сложность O(n^2), многовато будет...
тут можно проще сделать... в 1 проход по обеим строкам и при этом, если есть различия, то точно указать слова в которых они есть.

код писать сейчас лень... но смысл же прост - пройтись по строкам последовательно выделяя в них подстроки ограниченный пробельными символами(т.е. выбирая слова из строк) и сравнивать их приводя к общему регистру. там сложность O(n) вроде должна быть.

5
13 августа 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Norgat
не думаю что стоит сводить всё к этой задаче... там сложность O(n^2), многовато будет...


Именно к ней и сводится. В данном случае последовательности не символов но слов, а алгоритмическая сложность тут вообще ни при чем.

62K
13 августа 2010 года
Aleksey M.
5 / / 12.08.2010
Norgat, hardcase , спасибо вам большое за ваше мнение и подсказку. Сегодня попробую что-нибудь написать, если что - обращусь еще.

Лично мне кажется, что всё сводить к задаче о поиске наибольшей общей подпоследовательности нет смысла, так как вначале всё равно придётся делать одни и те же действия(удалять лишние ненужные символы, приводить всё к одному регистру), а потом легче просто сравнить строки, чем искать общие подпоследовательности.
5
13 августа 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Aleksey M.
Лично мне кажется, что всё сводить к задаче о поиске наибольшей общей подпоследовательности нет смысла, так как вначале всё равно придётся делать одни и те же действия(удалять лишние ненужные символы, приводить всё к одному регистру), а потом легче просто сравнить строки, чем искать общие подпоследовательности.


Не вижу во всем перечисленном проблемы: если вас интересуют только слова, то "мусорные" символы вам так или иначе придется отфильтровать; а для поиска недостающих / лишних слов простое сравнение строк вам не поможет - строки всеравно придется разбивать на токены. В любом случае, мат часть вам была продемонстрирована. Ваше право - использовать её или нет.

62K
13 августа 2010 года
Aleksey M.
5 / / 12.08.2010
hardcase, но ведь просто можно сравнивать строки, чтобы понять одинаковые они или нет?! А на следующем этапе, если мне всё-таки понадобится искать лишние/недостающие слова, то я обязательно воспользуюсь вашим советом.
62K
13 августа 2010 года
Aleksey M.
5 / / 12.08.2010
Norgat,я хотел спросить еще насчет регистров...У меня не работает с русским текстом, не подскажите в чем может быть проблема и как её исправить?

Еще я вот так пробовал, но тоже для русского не работает
Код:
#include <iostream>
#include <conio.h>
#include <ctype.h>
using namespace std;

void main()
{
    char str[]= "kukushonok";
    cout<<str <<endl;
    for(int i=0;i<10;i++)
    {
        str = toupper( str );
    }
    cout<<str<<endl;
    getch();
}
2.1K
14 августа 2010 года
Norgat
452 / / 12.08.2009
Цитата: Aleksey M.
Norgat,я хотел спросить еще насчет регистров...У меня не работает с русским текстом, не подскажите в чем может быть проблема и как её исправить?



добавь:
#include <locale>

и в самое начало main:
setlocale(LC_ALL, "RUS");

62K
16 августа 2010 года
Aleksey M.
5 / / 12.08.2010
Norgat,ещё раз большое спасибо вам за совет. Я всё написал, всё прекрасно)))

Теперь возникла новая проблема...Теперь я хочу знать каких слов не хватает/лишние в одной из двух строк. С помощью алгоритма поиска наибольшей общей подпоследовательности, можно только найти общую часть этих строк, а как найти слова, которые лишние/не достает? Не подскажите, можно ли модифицировать алгоритм так, чтобы выдавал ту часть, которая не входит в наибольшую общую подстроку? Или необходимо это делать какими-либо другими методами?
2.1K
16 августа 2010 года
Norgat
452 / / 12.08.2009
Цитата: Aleksey M.

Теперь возникла новая проблема...Теперь я хочу знать каких слов не хватает/лишние в одной из двух строк. С помощью алгоритма поиска наибольшей общей подпоследовательности, можно только найти общую часть этих строк, а как найти слова, которые лишние/не достает? Не подскажите, можно ли модифицировать алгоритм так, чтобы выдавал ту часть, которая не входит в наибольшую общую подстроку? Или необходимо это делать какими-либо другими методами?



http://www.cplusplus.com/reference/string/string/find/
http://www.cplusplus.com/reference/string/string/erase/

сначала ищешь все слова из 1й строки во 2й и удаляешь их...
если во 2й строке осталось что-то кроме пробельных символов, то это и будут лишние слова.
те слова, которые не были найдены - недостающие слова.

1.9K
17 августа 2010 года
Rad87
123 / / 14.12.2005
Возможно вам это будет полезно
http://alenacpp.blogspot.com/2010/07/blog-post_26.html
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог