Сравнить 2 файла в С++
Хотелось бы выслушать ваши предложения, как это всё в программе лучше организовывать? Не могли бы вы подробно рассказать, так как с таким раньше дела не имел вообще, да и программирую на с++ недавно(перешёл с basic'a c pascal'ем).
Сам я хотел считывать оба файла построчно(не знаю, можно ли это делать в с++), удалять всё, кроме букв и одного пробела между словами(методом распознавания по ascii коду символа к чему он относится, так как другого способа не знаю), преобразовывать все буквы в строчные и дальше уже сравнивать строки посимвольно и искать есть ли различия.
Может есть более легкий способ это реализовать? Подскажите, пожалуйста))
можно. нужно использовать STL(Standart Template Library).
а конкретно классы string (для хранения строк), ifstream - для чтения из файла.
у объекта класса ifstream есть метод getline(). смысл думаю понятен.
примеров чтения строк из файла с использованием ifstream и getline() на форуме выше крыши(лично я точно уже приводил и возможно не один раз).
по поводу сравнения без учёта регистра, вот пример кода:
#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 в самом начале списка линков... дерзай)
не думаю что стоит сводить всё к этой задаче... там сложность O(n^2), многовато будет...
тут можно проще сделать... в 1 проход по обеим строкам и при этом, если есть различия, то точно указать слова в которых они есть.
код писать сейчас лень... но смысл же прост - пройтись по строкам последовательно выделяя в них подстроки ограниченный пробельными символами(т.е. выбирая слова из строк) и сравнивать их приводя к общему регистру. там сложность O(n) вроде должна быть.
Именно к ней и сводится. В данном случае последовательности не символов но слов, а алгоритмическая сложность тут вообще ни при чем.
Лично мне кажется, что всё сводить к задаче о поиске наибольшей общей подпоследовательности нет смысла, так как вначале всё равно придётся делать одни и те же действия(удалять лишние ненужные символы, приводить всё к одному регистру), а потом легче просто сравнить строки, чем искать общие подпоследовательности.
Не вижу во всем перечисленном проблемы: если вас интересуют только слова, то "мусорные" символы вам так или иначе придется отфильтровать; а для поиска недостающих / лишних слов простое сравнение строк вам не поможет - строки всеравно придется разбивать на токены. В любом случае, мат часть вам была продемонстрирована. Ваше право - использовать её или нет.
Еще я вот так пробовал, но тоже для русского не работает
#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();
}
добавь:
#include <locale>
и в самое начало main:
setlocale(LC_ALL, "RUS");
Теперь возникла новая проблема...Теперь я хочу знать каких слов не хватает/лишние в одной из двух строк. С помощью алгоритма поиска наибольшей общей подпоследовательности, можно только найти общую часть этих строк, а как найти слова, которые лишние/не достает? Не подскажите, можно ли модифицировать алгоритм так, чтобы выдавал ту часть, которая не входит в наибольшую общую подстроку? Или необходимо это делать какими-либо другими методами?
Теперь возникла новая проблема...Теперь я хочу знать каких слов не хватает/лишние в одной из двух строк. С помощью алгоритма поиска наибольшей общей подпоследовательности, можно только найти общую часть этих строк, а как найти слова, которые лишние/не достает? Не подскажите, можно ли модифицировать алгоритм так, чтобы выдавал ту часть, которая не входит в наибольшую общую подстроку? Или необходимо это делать какими-либо другими методами?
http://www.cplusplus.com/reference/string/string/find/
http://www.cplusplus.com/reference/string/string/erase/
сначала ищешь все слова из 1й строки во 2й и удаляешь их...
если во 2й строке осталось что-то кроме пробельных символов, то это и будут лишние слова.
те слова, которые не были найдены - недостающие слова.