Не читается файл построчно 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 шт):
После первого же вызова 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. А вообще, все это совсем не так делается. Особенно перебор всех возможных вариантов строки...