0

Функция добавления баланса. Делаю путем считывания и записывания в вектор файла. Ищу необходимый аккаунт и в векторе меняю баланс. Далее удаляю весь файл и перезаписываю его из вектора. Проблема в том, что после записи в файле такое:

данные аккаунта 1 данные аккаунта 2 три пробела 0

Вот код класса:

class RegData
{
public:
    RegData(QString log = "", QString mail = "", QString pass = "", int bal = 0) : login(log), email(mail), password(pass), balance(bal)
    {
    }
    RegData(const RegData& src) :
        login(src.login), email(src.email), password(src.password), balance(src.balance)
    {
    }
    void cpy(const RegData& from)
    {
        login = from.login;
        email = from.email;
        password = from.password;
        balance = from.balance;
    }
void output()
{
    qDebug() << login<<email<<password<<balance;
}
QString getLogin()
{
    return login;
}
QString getEmail()
{
    return email;
}
QString getPassword()
{
    return password;
}
int getBalance()
{
    return balance;
}

void setLogin(const QString log)
{
    login = log;
}
void setEmail(const QString mail)
{
    email = mail;
}
void setPassword(const QString pass)
{
    password = pass;
}
void setBalance(const int bal)
{
    balance = bal;
}

private: QString login; QString email; QString password; int balance; };

А вот код функции

// объект класса RegData - usr объявлен в коде, там и присваиваются значения. Но с этим проблем нет
void addmoney::on_pushButton_clicked()
{
    int value = ui->horizontalScrollBar->value();
    int balanceres = 0;
    QFile file("C:/Users/David/Documents/Carsharring_files/users.txt");
    QVector<RegData> data;
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QTextStream in(&file);
        QString str1, str2, str3;
        int balance=0;
        while(!in.atEnd())
        {
            in>>str1>>str2>>str3>>balance;
            RegData tmp(str1, str2, str3, balance);
            data.push_back(tmp);
            qDebug() << tmp.getLogin()<<tmp.getEmail()<<tmp.getPassword()<<tmp.getBalance();
        }
        for(QVector<RegData>::iterator it = data.begin(); it<data.end(); it++)
        {
            if(it->getLogin() == usr.getLogin() && it->getPassword() == usr.getPassword())
            {
                balanceres = value+it->getBalance();
                it->setBalance(balanceres);
            }
        }
        file.close();
        QFile infile("C:/Users/David/Documents/Carsharring_files/users.txt");
        if(infile.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text))
        {
            for(QVector<RegData>::iterator it = data.begin(); it < data.end(); it++)
            {
                QTextStream textstr(&infile);
                textstr<<it->getLogin()<<" "<<it->getEmail()<<" "<<it->getPassword()<<" "<<it->getBalance()<<"\n";
            }
        }
    }
    usr.setBalance(balanceres); 
    QMessageBox::information(this, "Баланс", "Операция успешна");

}

Что я думаю, от чего это. После перезаписи файла, после последнего элемента идет переход на новую строку. И при считывании туда суется конструктор в пустую строку. Почему я так думаю, вот конструктор по умолчанию: RegData(QString login = "", QString email = "", QString password = "", int balance = 0), как раз таки так, как результат в файле. Да, поля пустые, но при записи есть же пробелы для разделения. От туда то и идет все.

И нет как убрать переход на новую строку т.к все аккаунты пойдут в одну строку...

P.S: Прошу без сильной критики, новичок.

  • 1
    while(!in.atEnd()) см. https://ru.stackoverflow.com/q/833980/195342 – Harry Jul 06 '22 at 17:56
  • я добавил проверку типа цикл { if(in.atEnd()) qDebug() << "Error"; else { ... } Всеравно не помогло. Еще ставил сначала выполнения тела, потом уже проверка, но не помогло всеравно – Nedaxses Jul 06 '22 at 18:04
  • 1
    Проверка должна быть не до, а после чтения. – Harry Jul 06 '22 at 18:21
  • while(!in.atEnd()) { ... } и что дальше даст проверка если конец файла? Просто же выведет "Конец" – Nedaxses Jul 06 '22 at 18:29
  • 1
    Вы читали ссылку, что я дал? Конец файла определяется только после неудачного чтения. Попробуйте заменить while(!in.atEnd()) { in>>str1>>str2>>str3>>balance; на while(in>>str1>>str2>>str3>>balance) { – Harry Jul 06 '22 at 18:34
  • Да, читал. Я так пробовал давненько уже, сейчас опять и не работает. Could not convert 'QTextStream' to 'bool' – Nedaxses Jul 06 '22 at 18:38
  • Вот потому я и не даю это все как ответ — я с Qt не работаю... – Harry Jul 06 '22 at 18:48

2 Answers2

1

Ваше решение

Перед записью данных в вектор проверял, не пустой ли логин, емейл и пароль

конечно, тоже решение. Вроже чопика, забитого в протекающую трубу: вроде и работает, но некрасиво и ненадежно...

Почему бы вам не проверять результат чтения? например, как предлагал Harry, только воспользоваться функцией состояния потока?

while((in>>str1>>str2>>str3>>balance).status() == QTextStream::Ok)
Mikhajlo
  • 12,592
0

Решил вопрос проверкой. Перед записью данных в вектор проверял, не пустой ли логин, емейл и пароль