c++ - QFile和QTextStream帮助(用Usernames、passwords和names为用户写一个ID)

标签 c++ qt

我正在做一个项目的任务,我需要一些关于 QFile 和 QTextStream 的帮助。我想最初创建一个文件(名为:users.txt),里面有这个:

ID   Password    Name and Surname   Username
1    |  cheese    |  Daniel Markov  |  MaDanjel
2    |  something |  Mika Firring   |  Marila
..
..

到目前为止,我得到了 skrivno.txt 的以下内容:

0202|Nejc Zun|nejczun|

这是代码:

void registracija::write() {
    QFile username("skrivno.txt");
    if(!username.open(QIODevice::Append))
        QMessageBox::information(0,"Error",username.errorString());
     QTextStream u1(&username);
     username.open(QIODevice::Append | QFile::Text);
     u1 << ui->lineEdit_3->text()+"|"; //code
     u1 << ui->lineEdit_4->text()+"|"; //name and surname
     u1 << ui->lineEdit_5->text()+'\n'; //password
     username.close();
}

我的计划是从这个函数中调用文本:

void MainWindow::on_pushButton_3_clicked()//login
{
    QFile username("skrivno.txt");
    if(!username.open(QIODevice::ReadOnly))
        QMessageBox::information(0,"Error",username.errorString());
    QTextStream u1(&username);
    username.open(QIODevice::ReadOnly | QFile::Text);
    QString temp;
    while (!u1.atEnd()) {
        temp = u1.readLine();
        if((ui->lineEdit_2->text()== temp.section("|",0,0)) && (ui->lineEdit->text()== temp.section("|",2,2))){
            ui->label_2->setText("Welcome: " + temp.section("|",1,1));
            ui->progressBar->show();
            for(int a=0;a<101;a++){
                ui->progressBar->setValue(a);
            }
            Open_Window();
            ui->progressBar->close();
            ui->un1->close();
            ui->un2->close();
            ui->label_3->close();
            player->stop();
        }else{
            ui->label->close();
            ui->un1->show();
            ui->un2->show();
            ui->label_3->show();
            player->stop();
        }
    }
    username.close();
}

并且它可以从不同的用户那里读取信息,因此它会检查用户的用户名和密码,如果它是正确的用户并使用正确的密码,它就会让他打开下面的东西。

这是只测试文件 skrivno.txt 的第一行的代码

if((ui->lineEdit_2->text()== temp.section("|",0,0)) && (ui->lineEdit->text()== temp.section("|",2,2)))

现在我需要这方面的帮助,所以它不仅会在文本中写入 ID,还会检查所有用户及其密码是否正确,而不仅仅是文件中的第一个。


我的代码有效。我需要通过以下方式改进代码:

  • 在文本文件中添加ID(我不知道如何每次加1 有人注册新用户的时间。
  • 检查每个用户和他们的密码(不仅是第一个)

像这样:

void registracija::write() {
        QFile username("skrivno.txt");
        if(!username.open(QIODevice::Append))
            QMessageBox::information(0,"Error",username.errorString());
         QTextStream u1(&username);
         username.open(QIODevice::Append | QFile::Text);
         u1 << SOMEHOW ADD THE ID IN HERE AND ALWAYS ADD IT +1 // <= help needed
         u1 << ui->lineEdit_3->text()+"|"; //code
         u1 << ui->lineEdit_4->text()+"|"; //name and surname
         u1 << ui->lineEdit_5->text()+'\n'; //password
         username.close();
    }

最佳答案

也许这种方法会满足您的需要:)

class User;
QDebug       operator<< (QDebug d, const User &user);
QTextStream& operator<< (QTextStream& os, const User& user);


class User
{
public:
    User();
    User(QString data);

    bool setData(const QString &data);

    int id() const                              { return m_id; }
    void setId(int id)                          { m_id = id; }

    QString username() const                    { return m_username; }
    void setUserName(const QString &username)   { m_username = username; }

    QString name()      const                   { return m_name; }
    void setName(const QString &name)           { m_name = name; }

    QString password()  const                   { return m_password; }
    void setPassword(const QString &password)   { m_password = password; }

private:
    int m_id;
    QString m_username;
    QString m_name;
    QString m_password;
};

-

QDebug operator<<(QDebug d, const User &user) {
    QStringList data;
    data << QString::number(user.id());
    data << user.username();
    data << user.name();
    data << user.password();
    return d << data.join("|");
}

QTextStream& operator<< (QTextStream& os, const User& user){
    QStringList data;
    data << QString::number(user.id());
    data << user.username();
    data << user.name();
    data << user.password();
    return os << data.join("|") << "\n";
}


User::User()
{

}


User::User(QString data)
{
    setData(data);
}


bool User::setData(const QString &data)
{
    QStringList splittedData = data.split("|");
    m_id        = splittedData.value(0).toInt();
    m_password  = splittedData.value(1).trimmed();
    m_name      = splittedData.value(2).trimmed();
    m_username  = splittedData.value(3).trimmed();
    return true;
}

-

class UserManager
{
public:
    UserManager();

    bool readUsers(const QString &fileName);
    bool writeUsers(const QString &fileName);

    bool userExists(const QString &username) const;
    bool addUser(const QString &username, const QString &name, const QString &password);
    bool checkPassword(QString username, QString password) const;
    int lastId() const;

private:
    QMap<QString, User*> m_users;
    int m_lastId;
};

-

bool lessThan(User* u1, User* u2){
    return u1->id() < u2->id();
}

UserManager::UserManager()
{
    m_lastId = 0;
}

bool UserManager::readUsers(const QString &fileName)
{
    QFile file(fileName);
    if (!file.exists()){
        qDebug() << QString("Error: File not found: '%1'").arg(fileName);
        return false;
    }

    if (file.open(QIODevice::ReadOnly)){
        QTextStream stream(&file);
        stream.readLine(); // drop header
        while (!stream.atEnd()){
            QString data = stream.readLine();
            User *user = new User();
            user->setData(data);
            m_lastId = (user->id() > m_lastId) ? user->id() : m_lastId;
            m_users.insert(user->username(), user);
        }
        return true;
    } else {
        qDebug() << QString("Error: Could not open file '%1'").arg(fileName);
    }
    return false;
}


bool UserManager::writeUsers(const QString &fileName)
{
    QFile file(fileName);
    QList<User*> list = m_users.values();
    qSort(list.begin(), list.end(), lessThan);
    if (file.open(QIODevice::WriteOnly)){
        QTextStream stream(&file);
        foreach(User *user, list){
            stream << *user;
        }
        return true;
    } else {
        qDebug() << QString("Error: Could not open file '%1'").arg(fileName);
    }
    return false;
}


bool UserManager::userExists(const QString &username) const
{
    return m_users.keys().contains(username);
}


bool UserManager::addUser(const QString &userName, const QString &name, const QString &password)
{
    if (m_users.contains(userName)){
        qDebug() << QString("User '%1' already exists").arg(userName);
        return false;
    }

    User *user = new User;
    user->setId(++m_lastId);
    user->setUserName(userName);
    user->setName(name);
    user->setPassword(password);
    m_users.insert(userName, user);
    return true;
}


bool UserManager::checkPassword(QString username, QString password) const
{
    if (m_users.keys().contains(username)){
        return m_users.value(username)->password() == password;
    }
    return false;
}

int UserManager::lastId() const
{
    return m_lastId;
}

关于c++ - QFile和QTextStream帮助(用Usernames、passwords和names为用户写一个ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630539/

相关文章:

c++ - 在 ICDBurn windows api 中更改默认刻录驱动器

c++ - 在 Visual Studio C++ 的图片框中缩放图片

c++ - QT QCharts添加删除系列

java - 我如何在 C++ 的堆栈上正确添加 QTWidgets?

qt - 将自定义小部件添加到 QTableWidget 单元格

c++ - std::unique_ptr::release() 与 std::move()

c++ - Bison C++ 中间规则值因变体而丢失

c++ - 工厂只需要声明 copy ctor 而无需实现

c++ - 使用 QtCreator 和 qt5 安装 Qt3D 时出错

c++ - 如何在鼠标单击时获取 QTreeWidget 中当前选定项的绝对路径