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