Это для каждой буквы, скорее всего, а мне был бы нужен код после этого, ибо до этого всё нормально работает.
Так тут сразу чтение из файла и заполнение map сочетаниями, дальше только вывести его.
Помочь можете? Именно в моём случае.
Это ж было уже
Смотрите, мне нужно именно из переменной text найти двухбуквенные сочетания, а там переменная типа char.
Чот имя переменной врет, это не текст, а один символ ) Это скорее например ch
.
Но тут же почти так есть, просто читается вся строка, а не по одному символу.
Так даже проще, не нужен второй цикл.
Еще, кстати, по идее надо конвертировать все буквы в один регистр, чтобы Хо
и хо
были одним сочетанием.
Функция tolower, хз будет ли это работать для русских символов.
ifstream fin.......
is_open........
map<string, int> m;
string s = "";
char ch;
while (fin.get(ch)) {
ch = char(std::tolower(ch));
if ((ch >= 'a' && ch <= 'z') || (ch >= 'а' && ch <= 'я')) {
if (s.length() == 0) {
s = ch;
} else {
if (s.length() == 1) {
s = s + ch;
} else {
s[1] = ch;
}
m[s]++;
s[0] = s[1];
}
} else {
s = "";
}
}
У меня в переменной text - весь текст с файла
while (fin.get(text))
cout << text;
cout << endl;
Надо именно в этом тексте найти двухбуквенные сочетания.
Нет. Там один символ на каждой итерации этого цикла посимвольного чтения файла.
После цикла соответственно там будет последний прочитанный символ.
Блин, а что тогда делать в моём случае? Нужно именно из текста сочетания.
Так было ж уже чтение в строку? Даже с фильтрацией только букв.
Вообще проще всего читать в строку так:
string text;
char ch;
...
while (fin.get(ch)) {
text += ch;
}
cout << text << endl;
и потом просто цикл как было в первом примере или тут
map<string, int> m;
string s = "";
- while (fin.get(ch)) {
+ for (auto ch : text) {
ch = char(std::tolower(ch));
if ((ch >= 'a' && ch <= 'z') || (ch >= 'а' && ch <= 'я')) {
......................
}
Или если с filter
из кода выше, то можно убрать тут проверку букв и tolower.
Только в коде выше скорее всего не работает чтение тут
потому что файл уже был прочитан до этого и fin
уже в конце файла.
Странный вопрос какой-то. А скомпилировать и запустить не судьба?
Скорее всего, ТС сам ничего делать и не собирается и ушел в теоретизирование:
Потеряны разделители букв. Поэтому и вставлено туда где фильтрация.
Непонятно что должен был продемонстрировать скриншот, но сверху явно что-то не то.
s
это переменная для текущего сочетания:
и внизу странный цикл + зачем-то вывод на каждой итерации цикла для поиска сочетаний.
Стопэ, а что выводиться-то должно?
m
в конце программы.
s
это просто переменная для текущего сочетания во время прохода текста.
Поэтому оно и инициализируется пустой строкой в начале + при сбросе когда встретили не букву.
Так был же уже вывод мапа в коде выше, просто в конце программы надо, а не в этом цикле.
Для чего второй for
с ++m[v]
? И s
так и не исправлено.