【问题标题】:How can I check if a file contains only integers?如何检查文件是否仅包含整数?
【发布时间】:2020-02-20 09:52:31
【问题描述】:

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

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

【问题讨论】:

  • 我觉得你可以试试regex
  • 在检查之前您已经分配给 int。问题也需要更多澄清。你能把你想接受的东西列为int 吗?您的文件结构如何?示例文件会很好。
  • 感谢您的回答。该文件是这样的:-2 24 4 71 .... on for each line
  • " 程序崩溃了。" : 它在哪里崩溃了?

标签: c++ qt file integer


【解决方案1】:

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

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,您可以为这种情况添加检查。

【讨论】:

  • 很好的解决方案。谢谢。
【解决方案2】:

请在此处阅读有关验证方法的文档:

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

您正在使用valid(-999, 999, this);作为有效输入的标准

因此,如果文件中的列表包含 1000 行,使用 toInt 方法将返回误报结果!

结果并不像你想象的那样只是 True 或 False...

你实际上得到了:

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多