0

Не читает слова из файла "input.txt" (24 строчка). Если getline заменить на fin >> word, то ничего не изменится. В чем проблема?

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

string wordsChecker(string checkWord) // функция для проверки слова
{
    for (int i = 0; i < checkWord.length() - 1; i++)
    {
        if (checkWord[i] && checkWord[i + 1] == 'б', 'в', 'г', 'д', 'ж', 'з', 'к', 'л', 'м', 'н', 'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ')
        {
            return checkWord;
        }
    }
}

int main() {
    setlocale(LC_ALL, "Russian");
    string word;
    ifstream fin("input.txt"); // текстовый файл для чтения
    while (!fin.eof()) // цикл для вывода и получения слов
    {
        getline(fin, word);
        cout << wordsChecker(word) << ' ';
    }
    system("pause");
    return 0;
}
Harry
  • 221,325
  • 1
    Во-вторых, вот так- while (!fin.eof()) - вы будете делать одно лишнее (неверное) чтение. А во-первых, вы проверяли, например, что файл открыт? в коде этого нет. Попробуйте для начала убедиться, что файл открыт, а после считывания просто выводить word без обработки - для начала. – Harry Mar 25 '18 at 13:36
  • @Harry да, файл открыт. Но значение word пусто при чтении. Несмотря на это вместо слов которые проходят проверку выводятся вообще все слова которые есть в файле. – Dmitry Shevchenko Mar 25 '18 at 13:42
  • Что вы пытаетесь проверить условием checkWord[i] && checkWord[i + 1] == 'б', 'в', 'г',...? Оно всегда истинно. И что должна вернуть функция wordsChecker, если checkWord.length() будет равно 1? – wololo Mar 25 '18 at 13:45
  • 1
    wordsChecker возвращает мусор и вызывает неопределенное поведение. checkWord[i + 1] == 'б', 'в', 'г', 'д' не сравнивает с каждой буквой из списка. – user7860670 Mar 25 '18 at 13:51
  • 1
    E вас написано четко "не читает слова". Т.е. не выполняется чтение из файла. Как могут выводиться "все слова, которые есть в файле", если вы пишете "Не читает слова из файла"??!! Вы уж определитесь... И задайте вопрос ТОЧНО! – Harry Mar 25 '18 at 13:56
  • @Harry ошибся. Должны выводиться слова где есть две гласные буквы подряд, но на практике он выводит любое слово. Значит проблема в checkWord[i] && checkWord[i + 1] == 'б', 'в', 'г',...? Как тогда по другому написать эту строчку чтобы проверка выполнялась корректно? – Dmitry Shevchenko Mar 25 '18 at 14:01
  • @DmitryShevchenko, я не писал, что checkWord.length() всегда будет равно 1, я спросил, что по-вашему произойдёт, если checkWord.length() будет равно 1? Что по-вашему вернёт функция в такой ситуации? – wololo Mar 25 '18 at 14:02
  • @wololo ничего не вернет? Не будет захода в цикл for. – Dmitry Shevchenko Mar 25 '18 at 14:06
  • Да, вы правы, захода в цикл не произойдёт. А значит оператор return выполнен не будет. В языке C++ если тип возвращаемого функцией значения отличен от void, то она обязана вернуть некоторое значение при помощи оператора return. Если это требование не выполнено, то может произойти всё что угодно.То есть, в вашем случае, в ситуациях, когда цикл for не выполнится ни разу, произойдёт что-то нехорошее, например, программа аварийно завершиться. Таким образом, вы должны предусмотреть ситуацию, когда цикл for не выполнится ни разу. – wololo Mar 25 '18 at 14:24
  • @wololo если написать return 0, то появится ошибка. Что тогда надо написать чтобы он возвращал слово только при правильной проверке? – Dmitry Shevchenko Mar 25 '18 at 14:49
  • Ну, тип возвращаемого функцией значения — string, а значит и возвращать нужно либо объект типа string, либо нечто, что может быть приведено к этому типу. Можно, например, написать return string();, или return "bad_word"; Однако, по смыслу, функция предназначена для проверки того, удовлетворяет ли входная строка некоторому критерию или нет, и поэтому, возможно, лучшим решением будет поступить также как и в ответе Harry: сменить тип возвращаемого значения на bool и возвращать true или false. – wololo Mar 25 '18 at 16:43

1 Answers1

0

Ну, я бы делал примерно так (не тестировал, для изложения идеи):

bool check(const string& word)
{
    static char * vowels = "аеиоуэюяАЕИОУЭЮЯ";
    for(int i = 0; i < word.length()-1; ++i)
        if (strchr(vowels,word[i]) && strchr(vowels,word[i+1]))
            return true;
    return false;
}

int main()
{
    setlocale(LC_ALL, "Russian");
    string word;
    ifstream fin("input.txt"); // текстовый файл для чтения
    while(fin>>word)
        if (check(word)) cout << word << endl;
    system("pause");
    return 0;
}

Отдельный вопрос с кодировками, конечно... Для начала я бы подрессировал программу на английских текстах :)

Harry
  • 221,325