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

Posted

技术标签:

【中文标题】QFile 和 QTextStream 帮助(使用用户名、密码和名称为用户编写 ID)【英文标题】:QFile and QTextStream help (writing a ID for users with Usernames, passwords and names) 【发布时间】:2016-04-14 17:55:53 【问题描述】:

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

【问题讨论】:

我想从一个文本文件中读取(这是我想象的链接 - prntscr.com/as94mm),然后测试正在登录的用户是否在文本文件中并测试是否他有正确的密码,就像上面的代码一样 我会重新考虑这种方法。每行代表一个用户,所以我会从中创建一个类用户。并且您可以读取所有用户并将它们保存在列表或地图中,甚至更好的是可以处理用户的类。您现在执行此操作的方式可能会导致使用相同的用户名进行注册。周围的 Class 还可以记住用户拥有的最高 ID,如果添加新用户,将其递增 1 不会有问题。 【参考方案1】:

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

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;

【讨论】:

以上是关于QFile 和 QTextStream 帮助(使用用户名、密码和名称为用户编写 ID)的主要内容,如果未能解决你的问题,请参考以下文章

QFile / QTextStream 在写入删除文件时不显示错误

Qt笔记——QFile,QDataStream,QTextStream

6.3.1 读写文本示例

Qt QFile文件读写

Qt - QFile类(翻译)

Qt入门教程文件操作篇QFile文件处理对象