Я пытаюсь создать программу входа в систему, которая читает и пишет из текстового файла. По какой-то причине работает только первая строка текстового файла, а остальные не будут успешными.
#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);
🤔 А знаете ли вы, что...
C++ позволяет создавать пользовательские типы данных с использованием классов и структур.
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;
}