Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
Е
20 июля 2018 г. 18:39

Удаление буквенных значений из файла

Добрый вечер Евгений и форумчане! Подскажите пожалуйста как в qt файл очистить от буквенных символов и оставить только цифры?  В С++ был бы код таким:
using namespace std;
 ifstream f; //Поток для чтения.
    double c, b; int n=0;
    f.open(".//text.txt"); //Открываем файл в режиме чтения.
    if(f) //Если открытие файла прошло корректно, то
    {
        while(!f.eof()) //Организован цикл, выполнение цикла
        //прервётся, когда будет достигнут конца файла.
        {
            f>> c >> b; //Чтение очередного значения из потока f в переменную a.
            f.clear();
            f.ignore(32767, '\n');
            if (c > 0 && b != -9999)
            {
              if (!f.eof())
              {
                n++; //Увеличение количества считанных чисел.
              }
            }
        }
    f.close(); //Закрытие потока.

 

 
Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на VPS
9

Добрый день!

Не совсем понятно, что этот код в итоге должен делать, но можно считать построчно файл средствами QString и проверить, является ли это число цифрой или нет.
#include <QCoreApplication>
#include <QDebug>
#include <QFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile txtFile("/path/to/example.txt");

    if (!txtFile.open(QFile::ReadOnly))
        return -1;

    QString digitStr;

    while (!txtFile.atEnd())
    {
        QByteArray line = txtFile.readLine();

        for (char s : line)
        {
            if (QChar(s).isDigit())
            {
                digitStr.append(s);
            }
        }
    }

    qDebug() << digitStr;

    return a.exec();
}

А так в итоге можно реализовать саму проверку на число и более общими средствами C++, как у вас реализовано, по сути реализацию проверки не обязательно делать средствами Qt, да и вопрос в том, нужно ля вам преобразовывать в числ те символы или нет.


1
Е

Доброго утра всем! Представленный мною код был написан для копирования (только цифрового) содержимого из одного файла в другой, просто я убрал копирование чтобы упростить код для просмотра, но Вы Евгений угадали ход моих мыслей, так как я хотел копировать файл не в другой файл, а в переменную QString и за это в очередной раз благодарю Вас))

1
Е
Добрый вечер Евгений и форумчане! У меня ещё один вопрос: может есть какой-нибудь способ используя код представленный мной выше сразу записать значение потока f в переменную QString ?
0

Ну я не уверен, но попробуйте так

QString str;
f >> str;
0

А вообще, можете использовать стандартные средства Qt, раз уж его используете

QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);    // Чтение данных из файла
QString str;
in >> str; 
1
Е
К сожалению QString str; f >> str; не работает, пишет C:\Users\Evgeny\Desktop\QT\12661\12661\mainwindow.cpp:57: ошибка: no match for 'operator>>' (operand types are 'std::ifstream {aka std::basic_ifstream<char>}' and 'QString')
f>> kgk;

а остальное работает. Спасибо за подсказку! ^
0

Тогда или через переменную прогонять, как было сделано, или использовать QDataStream для Qt

0
Е
Всё-таки я его написал)):
void MainWindow::on_pushButton_clicked()
{
    ui->textEdit->clear();
    ui->textEdit_2->clear();
    QString filePath = QFileDialog::getOpenFileName(this, tr("Open File"),"/home",tr("Images (*.las *.txt)"));
    if(filePath != "")
    {
        ui->lineEdit->clear();
        ui->lineEdit->setText(filePath);
    QFile txtFile(ui->lineEdit->text());
    if (!txtFile.open(QFile::ReadOnly))
    {
        QMessageBox::information(this,"Error","Path not correct!");
        ui->statusBar->showMessage("Error!");
        return;
    }
    QString digitStr;
    while (!txtFile.atEnd())
    {
        QByteArray line = txtFile.readLine();
        for (char s : line)
        {
            digitStr.append(s);
        }
    }
    ui->textEdit->setText(digitStr);
    QString hjh;
    QStringList strList=digitStr.split('\n'); // /////
    QString pkk;
    QString stg;
    for (int i = 0; i < strList.size(); ++i)
    {
        stg = strList.at(i); // Забираем вторую строку (i)
        int pkp = 1;
        for (int trt = 0; trt < stg.size(); ++trt)
        {
            if ((stg.mid(trt, 1) == '0' || stg.mid(trt, 1) == '1' || stg.mid(trt, 1) == '2' || stg.mid(trt, 1) == '3' || stg.mid(trt, 1) == '4' || stg.mid(trt, 1) == '5' || stg.mid(trt, 1) == '6' || stg.mid(trt, 1) == '7'
                     || stg.mid(trt, 1) == '8' || stg.mid(trt, 1) == '9' || stg.mid(trt, 1) == '.'  || stg.mid(trt, 1) == ',' || stg.mid(trt, 1) == '\n' || stg.mid(trt, 1) == ' ' || stg.mid(trt, 1) == '-')
                    && stg.mid(trt, 2) != "--" && stg.mid(trt, 1) != '#')
            {
               ++pkp;
            }
            if (pkp == (stg.size()-1))
            {
                hjh.append(stg);
            }
        }
      pkk = stg;
    }
    QString stgs;
    QString sas;
    QString shs;
    for (int kj = 0; kj < hjh.size(); ++kj)
    {
        stgs = hjh.mid(kj, 1);
        if (!(stgs == " " && sas == " "))
        {
            shs.append(stgs);
        }
        sas = stgs;
    }
    ui->textEdit_2->setText(shs);
    txtFile.flush();
    txtFile.close();
    }
}

 

0
Е
Результат:

Программа полностью очищает исходный файл (левый textedit) от строк содержащих не цифровые символы (результат в правом textedit) и записывает результат в переменную QString, а дальше можно делать с ней что душе угодно))

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ПМ
18 марта 2019 г. 15:12
Пётр Махнёв

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
ЯГ
18 марта 2019 г. 7:59
Ян Греку

C++ - Тест 003. Условия и циклы

  • Результат:21баллов,
  • Очки рейтинга-10
МД
15 марта 2019 г. 16:32
Михаил Дементьев

C++ - Тест 001. Первая программа и типы данных

  • Результат:60баллов,
  • Очки рейтинга-1
Последние комментарии
16 марта 2019 г. 13:55
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
12 марта 2019 г. 10:19
Jean Stefanovich

Большое спасибо за разъяснения!
12 марта 2019 г. 10:04
Евгений Легоцкой

Hello, In fact, this functionality or is not implemented, or is not documented. I'm not sure. But I think, that it should be implemented in Text QML Type. Because of we can write text in...
12 марта 2019 г. 9:51
Евгений Легоцкой

Да вы правы. На самом деле проще через QSqlQueryModel, сколько не пытался использовать эти дженерики типо QSqlTableModel и QSqlRelationalTableModel, то всегда упирался в какие-то их ограничени...
JS
12 марта 2019 г. 9:47
Jean Stefanovich

Единицы измерения лежат там же где и названия продуктов. Просто в таблице ингредиенты нет ещё одного столбца, на который можно было бы установить setRelation. Я в итоге в базе создал ещё один ...
Сейчас обсуждают на форуме
17 марта 2019 г. 22:47
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
15 марта 2019 г. 21:52
Чарльз Грин

спасибо, попробую, отпишусь
m
15 марта 2019 г. 19:41
mihamuz

Сори догадался)
n
12 марта 2019 г. 16:57
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
12 марта 2019 г. 13:20
BlinCT

Ну так если у вас есть готовая программа так ей и воспользуйтесь. Вы же написали ее вот и пользуйтесь.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы