Чтение нескольких строк из текстового файла в С++

Я пытаюсь создать программу входа в систему, которая читает и пишет из текстового файла. По какой-то причине работает только первая строка текстового файла, а остальные не будут успешными.

#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++ позволяет создавать пользовательские типы данных с использованием классов и структур.


34
1

Ответ:

Решено

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; 
}