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

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

#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);

Что касается вашей проблемы. посмотрите на код: как вы нетreturn в первой итерации и, следовательно, переходите ко второй и т. д.? Эта петля... нет. Вы либо return true;, либо return false;. Полностью уберите блок else и просто поместите голый return false; прямо перед закрытием } функции. Независимо от того, ваши «записи» относятся к строке, поэтому прочитайте всю строку в одну строку, затем используйте форматированное извлечение с помощью std::istringstream, загрунтованное строкой чтения, чтобы получить идентификатор пользователя и пароль.

WhozCraig 17.05.2022 21:30

@WhozCraig большое спасибо, я действительно тупой в 3 часа ночи

junie 17.05.2022 21:35

Пробовали ли вы запускать свой код построчно в отладчике, отслеживая значения всех переменных, чтобы определить, в какой момент ваша программа перестает вести себя так, как предполагалось? Если вы не пробовали это, вам может быть интересно прочитать это: Что такое отладчик и как он может помочь мне в диагностике проблем? Вы также можете прочитать это: Как отлаживать небольшие программы?

Andreas Wenzel 17.05.2022 22:57
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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; 
}

большое спасибо за это <3

junie 17.05.2022 22:07

Другие вопросы по теме