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 |
//Листинг #1 Visual Studio 2015 #include <iostream> #include <fstream> #include <string> #include <cstring> using namespace std; /* ФУНКЦИЯ ПРОВЕРКИ НУЖНОСТИ ФИЛЬТРАЦИИ СЛОВА */ bool filter_hide_star(const char* word, const char* dictionary) { //на приём: проверяемое слово, название файла-словаря слов char S[255] = ""; //слово, читаемое из словаря ifstream FDict(dictionary); //файловый поток FDict для обхода словаря /*ЧТЕНИЕ СЛОВ СЛОВАРЯ*/ while ( FDict >> S) { { if (!strcmp(S,word)) { //Если входящее в функцию слово word найдено в словаре, return true; //говорим "true" } } FDict.close(); //Закрываем файловый поток return false; //Если проход холостой, обозначаем "false" } /* ФУНКЦИЯ СОБИРАЕТ СЛОВА ИЗ СИМВОЛОВ С СОХРАНЕНИЕМ ВСЕХ НЕСЛОВЕСНЫХ СИМВОЛОВ*/ void read_word(ifstream &input, const char* SEPARATOR, const char* dictionary) { //на приём: анализируемый файловый поток, строка разделителей, название файла словаря char ch = 0; //символ, читаемый в анализируемом файле char word[255] = ""; //строка для сборки слов unsigned count = 0; //счётчик-курсор для помощи нам в ориентации позиции в строке bool word_flush; //признак собранного слова /*ОБХОД ФАЙЛА*/ while ((ch = input.get()) != EOF){ //обходим посимвольно, пока в символ ch не попадёт символ-признак окончания файла if (strchr(SEPARATOR, ch) || ch == '\n') { //проверяем символ на принадлежность к разделителям и на перенос строки if (!word_flush) { //проверяем признак сборки слова //cout << word; if (filter_hide_star(word, dictionary)) { //проверяем необходимость замены слова на символ(ы)-маску cout << '*'; //если слово свстретилось в словаре, то пишем не само слово, а, например, звёздочку } else { //если слово не встретилось в словаре, cout << word; //то пишем слово как есть }; count = 0; //сбрасываем счётчик-курсор в начальную позицию word[0] = 0; //делаем слово пустым word_flush = true; //обозначаем, что слово было собрано и будет собираться заново } cout << ch; } else { word[count++] = ch; //добавляем символ вправо к собираемому слову word[count] = 0; //Последний символ строки должен быть признаком окончания строки, насильно записываем туда ноль-символ word_flush = false; //обозначаем, что слово собирается } } /*последнее собранное слово собралось, но не анализировалось, дополнительно анализируем, сразу после цикла*/ if (filter_hide_star(word, dictionary)) { //если слово найдено в словаре, меняем его на маску cout << '*'; } else { //в противном случае выводим слово как есть cout << word; }; cout << '\n'; } int main() { setlocale(LC_ALL, ""); const char *DICTIONARY = "dictionary.txt"; //Файл-словарь const char *INPUT = "input.txt"; //Файл для анализа const char *SEPARATOR = " !?.,"; //строка разделителей ifstream FNAme(INPUT); //Открываем файловый поток для чтения и анализа read_word(FNAme, SEPARATOR, DICTIONARY); //Собираем слова (в этой же функции подмена нужных слов маской-звёзочкой) system("PAUSE"); } |
Test string file Mama mila ramu Polevoi lopata kupol epel oskolki okean povest golova serdce angel svoboda krila nebesa tesT test
dictionary.txt
test Test povest swoboda
Не знаю почему, но не производится замена. Текст выводится в консоль в исходном виде.
Компилю под VS2005. В чем может быть причина?
Не знаю ответ.
Страница переписана. Исходник изменён.