在我的项目中,我需要上传一个文件,并检查文件内部是否每行都有一个整数(正数或负数),以便可以在矢量中表示它。
由于我正在研究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);
}
}
一种更简单的解决方案是逐行读取文件,并检查当前行是否可转换为整数。
Qt已经提供了许多方便的方法。例如,您可能会对QByteArray::toInt()
感兴趣。
因此解决方案可能是:
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
,则可以为此情况添加支票。
请在此处阅读有关validate方法的文档:
false
您正在使用有效输入的条件作为https://doc.qt.io/archives/qt-4.8/qintvalidator.html#validate
因此,如果文件中的列表包含1000行,则使用toInt方法将返回错误的肯定结果!
结果不只是您可能认为的是非,否则...
您实际上得到:
valid(-999, 999, this);