У меня проблемы с чтением текстового файла с помощью Qt.
Мой текстовый файл выглядит так:
17,9001500000000 31,1151700000000 450 0 NaN NaN NaN NaN NaN NaN
1 1 1390309311,00000 0,999847695156391 0,999847695156391 0,999847695156391 0,999847695156391 0,999847695156391 0,999847695156391 0,999847695156391
1 2 1390309311,00000 0,999695413509548 0,999695413509548 0,999695413509548 0,999695413509548 0,999695413509548 0,999695413509548 0,999695413509548
и так далее..
Данные разделены пробелом
Первая строка: первые столбцы первой строки написаны с информацией, которая мне нужна для следующих строк. Не каждый столбец в первом ряду используется. После небольшого количества информации столбцы заполнены «NaN».
Следующие строки:
Здесь мои данные размещаются. Я хочу прочитать все это построчно. Первые 3 столбца снова являются общей информацией для строки, следующие (скажем, 300 столбцов) заполняются 3 различными типами данных (каждый тип размером 100 измерений).
Итак, я прочитал мой файл:
Во-первых, если я читаю в первой строке, я хочу получить общую информацию для всего файла. (info1, info2, info3, info4)
Затем я прочитал следующие строки, разделенные пробелом.
if (!File.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
QTextStream in(&metFile);
QString line;
int linecount = 0;
double info1,info2,info3,info4;
double lineinfo1,lineinfo2,lineinfo3;
while (!in.atEnd()) {
if (linecount==0) {
in >> info1 >> info2 >> info3 >> info4;
linecount++;
}
else {
line = in.readLine();
QStringList lineparts = line.split(QRegExp("\\s+"));
lineinfo1=lineparts[0].toFloat;
lineinfo2=lineparts[1].toFloat;
lineinfo3=lineparts[2].toFloat;
for (int count=1; count<=100;count++) {
float data1=lineparts[count+2].toFloat();
float data2=lineparts[100+count+2].toFloat();
float data3=lineparts[2*100+count+2].toFloat();
}
linecount++;
}
}
Теперь info1-4 читаются правильно. Но после этого lineinfo1-3 и data1-3 (lineparts [0] и т. Д.) Заполняются nan или 0 ?!
Кто-нибудь может мне помочь?
Спасибо!
Вот мое решение, чтобы попробовать:
Просто измените код, и я думаю, что это должно работать:
if (linecount==0) {
in >> info1 >> info2 >> info3 >> info4;
QString remaining_line = in.readLine(); //This should pass from NaN's to next line inside your else
linecount++;
}
Я предполагаю, что в вашем коде после чтения первых четырех чисел элемент управления все еще находится на первой строке, а внутри «else», когда вы читаете строку, он читает оставшуюся строку, где есть только NaN.
Лучший способ при написании кодов для чтения файлов — всегда печатать то, что вы читаете, при тестировании своего кода. Дайте мне знать, если это работает для вас.
Сантош