Как я могу проверить, содержит ли файл только целые числа? - PullRequest
1 голос
/ 20 февраля 2020

В моем проекте мне нужно загрузить файл и проверить, что внутри него есть целое число (положительное или отрицательное) для каждой строки, чтобы его можно было представить в векторе.

Поскольку я работаю над QT и C ++, я рассмотрел два предложения, но оба, когда я вставляю число в файл, например «35.2» с запятой, и нажимаю кнопку запуска, программа вылетает.

Есть ли лучшее решение для смягчения проблемы? Я прилагаю одно из решений, которое я оценивал.

QFile file_in(file_name);

file_in.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream in(&file_in);
int elem;
int pos = 0;
QString s;
QIntValidator valid(-999, 999, this);

while(!in.atEnd())
{
    in >> elem;
    s = QString::number(elem);
    if(!valid.validate(s,pos))
    {
        v.clear();
        QMessageBox msg(this);
        msg.setText("Input non valido");
        msg.exec();
        return;
    }
    else
    {
        v.push_back(elem);
    }
}

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Более простым решением было бы прочитать файл построчно и проверить, можно ли преобразовать текущую строку в целое число.

Qt уже предоставляет множество удобных методов. Например, вас заинтересует QByteArray::toInt().

Следовательно, решение может быть таким:

bool validate(const QString & file_name)
{
    QFile in_f(file_name);
    if(!in_f.open(QIODevice::ReadOnly | QIODevice::Text))
        return false;

    bool is_valid = true;
    while(is_valid && !in_f.atEnd())
    {
        QByteArray line = in_f.readLine();
        line.toInt(&is_valid); // is_valid is set to false if the conversion failed
    }
    return is_valid;
}

Таким образом, нет cra sh. Если каждая строка содержит целое число, она вернет true, в противном случае, если хотя бы одна строка содержит что-то еще (string, double, ...), она вернет false.

Как реализовано здесь , если файл пуст, функция вернет true. Конечно, вы можете добавить проверку для этого случая, если хотите вернуть false.

1 голос
/ 20 февраля 2020

Пожалуйста, прочитайте do c о методе проверки здесь:

https://doc.qt.io/archives/qt-4.8/qintvalidator.html#validate

вы используете критерии для допустимых входных данных как valid(-999, 999, this);

, поэтому, если список в файле содержит строку с 1000, использование метода toInt вернет вам ложноположительный результат!

результат не просто True или False как вы можете думать ...

вы на самом деле получаете:

enter image description here

...