QFile和QTextStream帮助(为具有用户名、密码和名称的用户编写ID)



我正在为一项任务做一个项目,我需要一些关于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;
}

最新更新