Не читается файл построчно c++

Пишу программку для генерации паролей. Функция check проверяет существует ли уже такая запись, если существует, то её не надо записывать в файл. Но она все время возвращает false(Даже если записывается все время один и тот же символ). Я пробежался отладчиком и как выяснилось даже в цикл while не заходит.

std::string str;
std::string strInput;
std::ifstream inf("pass.txt");
std::ofstream fout("pass.txt");

int count_line = 0;
int povtor = 0;

char buff[62] = {'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','0','1','2','3','4','5','6','7','8','9'};

bool check(std::string str) { // проверка на существование записи
    
    while (getline(inf, strInput)) { 
        std::cout << strInput << std::endl; 
        if (strInput == str) {
            povtor++;
            
            return true;
        }
         
    }

     
    
    return false;

}

void BruteForce(int str_long) {

    for (;;) {
        
        for (int i = 0; i < str_long; i++) 
        {
            str += buff[rand() % 62 + 0];       
        }

        if (!check(str))
        {
        fout << str << std::endl;
        count_line++;
        }
        else
        {
            continue;
        }
        
        std::cout << "Слово записано: " << str << "\nКол-во слов: " << count_line << "\nКол-во повторившихся: " << povtor << "\n";
        str.clear();
        system("cls");
        
        if (GetAsyncKeyState(VK_F1)) {
            fout.close();
            inf.close();
            break;
        }

    }

    
}

int main()
{    
    srand(time(0));
    setlocale(LC_ALL, "RUS");
    BruteForce(1);
}

Ответы (1 шт):

Автор решения: Harry

После первого же вызова check вы закрываете файл, и все ваши попытки чтения — из закрытого файла. Естественно, ничего не читается, ничего не сравнивается, и возвращается false.

Надеюсь, вопроса "и как это исправить?" не будет, и вы подумаете и решите эту проблему самостоятельно.

Update
Ну что ж, надежды не оправдались...

Вариант 1. С открытием файла в каждом вызове check.

ofstream fout("pass.txt");

int count_line = 0;
int povtor = 0;

char buff[62] = {'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','0','1','2','3','4','5','6','7','8','9'};

bool check(const string& str) { // проверка на существование записи
    ifstream inf("pass.txt");
    string strInput;
    while (getline(inf, strInput)) { 
        cout << strInput << std::endl;
        if (strInput == str) {
            povtor++;
            return true;
        }
    }
    return false;
}

void BruteForce(int str_long) {
    for (;;) {
        string str;
        for (int i = 0; i < str_long; i++)
        {
            str += buff[rand() % 62 + 0];
        }
        if (!check(str))
        {
            fout << str << endl;
            count_line++;
        }
        else
        {
            continue;
        }

        cout << "Слово записано: " << str << "\nКол-во слов: " << count_line << "\nКол-во повторившихся: " << povtor << "\n";
        getchar();
    }
}

int main()
{
    srand(time(0));
    //setlocale(LC_ALL, "RUS");
    BruteForce(1);
}

Вариант 2. С перемоткой. Обратите внимание на то, как идут строки ifstream и ofstream, и подумайте, почему это важно (подсказка: что будет, если файла еще нет?)

ofstream fout("pass.txt");
ifstream inf("pass.txt");

int count_line = 0;
int povtor = 0;

char buff[62] = {'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','0','1','2','3','4','5','6','7','8','9'};

bool check(const string& str) { // проверка на существование записи
    string strInput;
    inf.clear();
    inf.seekg(0);
    while (getline(inf, strInput)) { 
        cout << strInput << std::endl;
        if (strInput == str) {
            povtor++;
            return true;
        }
    }
    return false;
}

Остальное — как и в варианте 1.

Да, заодно исправил еще несколько ошибок. Там сами смотрите, что и почему. С клавиатурой — не ошибка, мне для отладки проще останов после каждой строки.

P.S. А вообще, все это совсем не так делается. Особенно перебор всех возможных вариантов строки...

→ Ссылка