Я пытаюсь создать программу входа в систему, которая читает и пишет из текстового файла. По какой-то причине работает только первая строка текстового файла, а остальные не будут успешными.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool loggedIn() {
string username, password, un, pw;
cout << "Enter username >> "; cin >> username;
cout << "Enter password >> "; cin >> password;
ifstream read("users.txt");
while (read) {
getline(read, un, ' ');
getline(read, pw);
if (un == username && pw == password) {
return true;
}
else {
return false;
}
}
}
Текстовый файл:
user1 pass1
user2 pass2
Альтернативы, которые я пробовал:
read.getline(un, 256, ' ');
read.getline(pw, 256);
@WhozCraig большое спасибо, я действительно тупой в 3 часа ночи
Пробовали ли вы запускать свой код построчно в отладчике, отслеживая значения всех переменных, чтобы определить, в какой момент ваша программа перестает вести себя так, как предполагалось? Если вы не пробовали это, вам может быть интересно прочитать это: Что такое отладчик и как он может помочь мне в диагностике проблем? Вы также можете прочитать это: Как отлаживать небольшие программы?
while (read)
совпадает с while (!read.fail())
, что является неправильным условием цикла для использования в вашей ситуации. Вы не проверяете, успешны ли оба вызова getline()
, прежде чем сравнивать строки, которые они выводят.
Вам также нужно переместить оператор return false;
из цикла. Поскольку у вас есть return
в обоих блоках if
и else
, вы сравниваете только 1-го пользователя в файле, а затем останавливаете цикл независимо от результата. Вы хотите продолжать читать пользователей из файла до тех пор, пока не будет найдено совпадение или не будет достигнут EOF.
Попробуйте это вместо этого:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool loggedIn() {
string username, password, un, pw;
cout << "Enter username >> "; cin >> username;
cout << "Enter password >> "; cin >> password;
ifstream read("users.txt");
while (getline(read, un, ' ') && getline(read, pw)) {
if ((un == username) && (pw == password)) {
return true;
}
}
return false;
}
В качестве альтернативы используйте 1 вызов std::getline()
для чтения всей строки, а затем используйте std::istringstream
для чтения значений из строки, например:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
bool loggedIn() {
string username, password, un, pw, line;
cout << "Enter username >> "; cin >> username;
cout << "Enter password >> "; cin >> password;
ifstream read("users.txt");
while (getline(read, line)) {
istringstream iss(line);
if ((iss >> un >> pw) && (un == username) && (pw == password)) {
return true;
}
}
return false;
}
большое спасибо за это <3
Что касается вашей проблемы. посмотрите на код: как вы нет
return
в первой итерации и, следовательно, переходите ко второй и т. д.? Эта петля... нет. Вы либоreturn true;
, либоreturn false;
. Полностью уберите блокelse
и просто поместите голыйreturn false;
прямо перед закрытием}
функции. Независимо от того, ваши «записи» относятся к строке, поэтому прочитайте всю строку в одну строку, затем используйте форматированное извлечение с помощьюstd::istringstream
, загрунтованное строкой чтения, чтобы получить идентификатор пользователя и пароль.