从文件中读取数据并将其保存在QHash中,如下所示:
QHash<int, QVector<float> >
我的数据文件不包含标题,所以当我第一次创建向量然后进入文件循环时,我会错过第一行的数据。我的来源是:
QFile file("...\\a.csv");
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::warning(0, "Error", file.errorString());
}
QString fileLine = file.readLine();
QStringList fileLineSplit = fileLine.split(',');
hashKeySize = fileLineSplit.size();
for(int t=0; t<hashKeySize; t++)
{
QVector<float> vec;
hash_notClustered[t] = vec;
}
while(!file.atEnd())
{
QString line = file.readLine();
QStringList list = line.split(',');
for(int t = 0; t<list.size(); t++)
{
hash_notClustered[t].push_back(list[t].toFloat());
}
}
问:在使用while(!file.atEnd())
循环时不能错过第一行时,如何将指针返回到第一行?
答案 0 :(得分:0)
使用file.close()
for(int t=0; t<hashKeySize; t++)
{
QVector<float> vec;
hash_notClustered[t] = vec;
}
并在while(!file.atEnd()){...}
解决问题之前重新打开它。
答案 1 :(得分:0)
重置QFile是一种方法。可能还有其他人。看看这段代码:
QFile file("...\\a.csv");
if(!file.open(QIODevice::ReadOnly)){
QMessageBox::warning(0, "Error", file.errorString());
}
QString fileLine = file.readLine();
QStringList fileLineSplit = fileLine.split(',');
int hashKeySize = fileLineSplit.size();
for(int t=0; t<hashKeySize; t++){
QVector<float> vec;
hash_notClustered[t] = vec;
}
do{
for(int t = 0; t<fileLineSplit.size(); t++){
hash_notClustered[t].push_back(list[t].toFloat());
}
fileLine = file.readLine();
fileLineSplit = fileLine.split(',');
}while(!fileLine.isEmpty());
C ++比'for'和'while'循环有更多的循环。 以上代码更有效吗?快点?没有bug?不知道。但至少在文件操作上少了。 :-)