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 在写入删除文件时不显示错误