Как вводить строки, начинающиеся со специальных символов - PullRequest
2 голосов
/ 29 апреля 2019

Я пытаюсь ввести все слова в карту на C ++, но программа зависает только тогда, когда слово начинается со специального символа.Код работает, когда в конце есть специальный символ.

Я не смог найти нужную документацию для оператора >> в C ++ или не смог правильно погуглить мою проблему.

//Map values and find max value
//The code works for all words except the ones that start with special characters

    while(myFile >> cWord){

        //put the characters into a string

        //DEBUG: cout << "real word: " << cWord << " | ";

                cWord = stripWord(cWord);

                //delete common words before they're in the system

        if(cWord == "a" ||
           cWord == "an" ||
           cWord == "and" ||
           cWord == "in" ||
           cWord == "is" ||
           cWord == "it" ||
           cWord == "the"){
            continue;
        }

        if (wordMap.count(cWord) == 0){
            wordMap.insert({cWord, 1});
        }
        else{
            wordMap[cWord]++;
            if(wordMap[cWord] > maxWordRep){
                maxWordRep = wordMap[cWord];
            }
        }
        //DEBUG: cout << cWord << " | " << wordMap[cWord] << endl;

    }

Я ожидаю, что отладка напечатает все слова, а затем будет следовать остальной части кода, но код перестает работать и останавливается в точной строке

while(myFile >> cWord)

Мой ввод - текст песнифайлы.Вот слова, которые программа заморозила:

Подсчет звезд: Завершено.

Я могу хлопнуть в ладоши: ​​Застрял на , потому что

Одинбольше ночи: Застрял в (да

Выполнить на тесте (файл для проверки комбинированных слов): Завершено

Безопасный танец: Застрял в '*

Встряхни это: Застрял в

Есть множество других, которые следуют тому же шаблону. Всегда 1 или более специальных символов впереди. Вы можетепопробуйте сами, и cin >> string застрянет, когда вы введете строку со специальным символом впереди.

Final Edit: ошибка была в функции stripWord, поэтому этот вопрос просто плохой.

1 Ответ

0 голосов
/ 29 апреля 2019

Этот код:

while(myFile >> cWord)

Оператор >> возвращает std :: istream &, поэтому оператор, вызываемый здесь: http://www.cplusplus.com/reference/ios/ios/operator_bool/

Обратите внимание, что он ищетнеудачный бит, который будет установлен на istream?Чтение до конца файла НЕ является ошибкой, поэтому на самом деле вы должны проверить, не достиг ли вы конца файла, например,

while(!myFile.eof())
{
  myFile >> cWord;

  /* snip */
}

Если файл имеет кучу бессмысленных пробеловв конце файла вы можете прочитать пустую строку в конце файла, о которой также следует позаботиться, например,

while(!myFile.eof())
{
  myFile >> cWord;

  if(cWord.empty()) break;

  /* snip */
}

Остальная часть кода (при условии, что она не содержит ошибок) должно быть хорошо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...