#c #qt #qtextstream
#c #qt #qtextstream
Вопрос:
У меня возникли проблемы с чтением текстового файла с помощью 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(amp;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 ?!
Кто-нибудь может мне помочь?
Спасибо!
Ответ №1:
Вот мое решение, чтобы попробовать:
Просто измените код на, и я предполагаю, что это должно сработать:
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.
Лучший способ при написании кодов чтения файлов — это всегда печатать то, что вы читаете, при тестировании вашего кода. Дайте мне знать, если это сработает для вас.
Сантош
Комментарии:
1. вы правы. Я не прочитал всю строку в цикле ‘linecount == 0’. Спасибо!