首页 > 解决方案 > 如何检查文件是否仅包含整数?

问题描述

在我的项目中,我需要上传一个文件并检查其中的每一行是否有一个整数(正数或负数),以便它可以在向量中表示。

由于我正在研究 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);
    }
}

标签: c++qtfileinteger

解决方案


一个更简单的解决方案是逐行读取文件并检查当前行是否可转换为整数。

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;
}

这样就没有崩溃。如果每一行包含一个整数,它将返回true,否则,如果至少一行包含其他内容(字符串、双精度、...),它将返回false

如这里所实现的,如果文件为空,则函数将返回true. 当然,如果您想返回,您可以为这种情况添加检查false


推荐阅读