Member 13927363 Ответов: 1

Пример кода не может прочитать/открыть файл при запуске


пустота loadTriangles()
{
QFile f( "C:Test/world.txt" );


if( !f.open( QIODevice::ReadOnly ) )
{
if( !QFile::exists(f.fileName()) )
{
QMessageBox::информация(это, "ошибка",
QString("файл %1 не существует").arg(f.fileName()));
}
еще
{
QMessageBox::информация(это, "ошибка",
QString("не удалось открыть файл %1: Ошибка %2").arg(f.fileName(), f.error()));
}
}
еще
{
// Чтение из файла
QTextStream ts( &f );

Вершина v[3];
int vcount = 0;
бул аллок, ОК;

в то время как( !ts.atEnd() )
{

Первоначально, в QString = ТС.с readline();
qDebug() << curLine;
первоначально = первоначально.упрощенный();
qDebug() << curLine;
QStringList line = curLine.split(' ');
for (int i = 0; i < line.count(); i++)
qDebug() << line[i];


if( line.count() == 5 )
{
она = истина;
v[vcount].x = line[0].toFloat( &ok );
первый &ампер;= ОК;
v[vcount].y = линия[1].toFloat( &ok );
первый &ампер;= ОК;
v[vcount].z = line[2].toFloat( &ok );
первый &ампер;= ОК;
v[vcount].u = line[3].toFloat( &ok );
первый &ампер;= ОК;
v[vcount].v = line[4].toFloat( &ok );
первый &ампер;= ОК;

если( аллок )
vcount++;

если( vcount == 3 )
{
vcount = 0;
Треугольник Т;
t.вершина[0] = v[0];
t.вершина[1] = v[1];
t.вершина[2] = v[2];

треугольники.добавить( Т );
}
}
еще
{
QMessageBox::информация(это, "ошибка", "ошибка здесь");
}
}

Ф.рядом();
}

}

Что я уже пробовал:

Ошибка существует, когда строка.count() != 5

что ему нужно, так это преобразовать
QStringList line = QString::split( " ", ts.readLine().simplifyWhiteSpace() );
к совместимости Qt5, так что все данные из файла на строку будут храниться в строке [], так как каждая строка состоит из 5 данных, поэтому она должна быть line.count() == 5

1 Ответов

Рейтинг:
1

Jochen Arndt

Не совсем понятно, что именно работает не так, как ожидалось. Но наиболее вероятная причина заключается в том, что файл не может быть найден, потому что вы используете простое имя файла без пути. Тогда файл должен быть расположен в текущем рабочем каталоге. Это в большинстве случаев - но не во всех - каталог, в котором находится исполняемый файл.

Я предлагаю указать полный путь к файлу.

Чтобы узнать что пошло не так вы можете добавить проверку если файл существует:

if( !f.open( QIODevice::ReadOnly ) )
{
    if( !QFile::exists(f.fileName()) )
    {
        QMessageBox::information(this, "Error", 
            QString("File %1 does not exist").arg(f.fileName()));
    }
    else
    {
        QMessageBox::information(this, "Error", 
            QString("Failed to open file %1: Error %2").arg(f.fileName(), f.error()));
    }
}
else
{
    // Read from file

    f.close();
}
Обратите также внимание, что вышеуказанные вызовы open() только один раз. В вашем опубликованном коде он вызывается дважды, и второй никогда не закрывается, когда он успешно завершается.


Member 13927363

эта строка дает ошибку --- QMessageBox::information(this, QString("Error", "File %1 does not exist").arg(f.fileName())); --- поэтому я перешел на простой синтаксис QMessageBox, но ни одна ошибка не существует, но все равно файл не был загружен.

До сих пор не могу понять, почему файл не может быть загружен, хотя я изменил его путь.

Jochen Arndt

Уупс. Строковый параметр "Error" относится к окну сообщения. Исправлено.

Что значит "не был загружен"?
Файл открыт?
Если нет, то это должно быть поймано и сообщено моим решением.
Если да, то это связано с обработкой содержимого файла. Если файл не содержит строк с 5 разделенными пробелами значениями с плавающей запятой, то ничего не произойдет. Вы можете проверить это, сообщив об этом (когда line.count() != 5) или отладив приложение (проверяя значения при пошаговом прохождении кода или печатая значения с помощью QDebug).

Member 13927363

пробовал, когда line.count() != 5 и там ошибка существует, может быть, эта строка QStringList line = ts.readLine().simplified().split(" "); не работает. Не могли бы вы помочь мне преобразовать эту строку QStringList = QString::split( " ", ts.readLine().simplifyWhiteSpace() ); в формат совместимости Qt5?

Jochen Arndt

Просто прочитав его здесь, он выглядит нормально при условии, что содержимое файла находится в ожидаемом формате.

Разделите его на отдельные вызовы функций и проверьте содержимое:
QString curLine = ts.readLine();
qDebug << curLine;
curLine = curLine.simplified();
qDebug << curLine;
QStringList line = curLine.split(' ');
for (int i = 0; i < line.count(); i++)
 qDebug << line[i];

Member 13927363

он прочитал строку с помощью qDebug, но все же строка.count != 5, она должна быть == 5, чтобы иметь возможность загрузить файл. Я не понимаю, в чем, казалось бы, проблема.

Jochen Arndt

Что такое входная строка?
Каково количество строк для этой строки?
Что находится в расщепленных струнах?

Member 13927363

то, что он выводит, - это содержимое файла с использованием предоставленного вами кода.

Jochen Arndt

У меня нет вашего досье, так что я не знаю, что это такое.

Таким образом, либо вы можете найти проблему, проверив вывод (он должен быть очевиден, когда он не разделен на 5 частей, как ожидалось), либо разместите его здесь.

Member 13927363

Привет, я обновил коды. Надеюсь, вы поможете мне разобраться в том, что казалось проблемой. Спасибо.

Member 13927363

если вы имеете в виду содержимое файла:


NUMPOLLIES 36

// Этажа 1
-3.0 0.0 -3.0 0.0 6.0
-3.0 0.0 3.0 0.0 0.0
3.0 0.0 3.0 6.0 0.0

-3.0 0.0 -3.0 0.0 6.0
3.0 0.0 -3.0 6.0 6.0
3.0 0.0 3.0 6.0 0.0

// Потолок 1
-3.0 1.0 -3.0 0.0 6.0
-3.0 1.0 3.0 0.0 0.0
3.0 1.0 3.0 6.0 0.0
-3.0 1.0 -3.0 0.0 6.0
3.0 1.0 -3.0 6.0 6.0
3.0 1.0 3.0 6.0 0.0

// A1

-2.0 1.0 -2.0 0.0 1.0
-2.0 0.0 -2.0 0.0 0.0
-0.5 0.0 -2.0 1.5 0.0
-2.0 1.0 -2.0 0.0 1.0
-0.5 1.0 -2.0 1.5 1.0
-0.5 0.0 -2.0 1.5 0.0

// A2

2.0 1.0 -2.0 2.0 1.0
2.0 0.0 -2.0 2.0 0.0
0.5 0.0 -2.0 0.5 0.0
2.0 1.0 -2.0 2.0 1.0
0.5 1.0 -2.0 0.5 1.0
0.5 0.0 -2.0 0.5 0.0

// B1

-2.0 1.0 2.0 2.0 1.0
-2.0 0.0 2.0 2.0 0.0
-0.5 0.0 2.0 0.5 0.0
-2.0 1.0 2.0 2.0 1.0
-0.5 1.0 2.0 0.5 1.0
-0.5 0.0 2.0 0.5 0.0

// B2

2.0 1.0 2.0 2.0 1.0
2.0 0.0 2.0 2.0 0.0
0.5 0.0 2.0 0.5 0.0
2.0 1.0 2.0 2.0 1.0
0.5 1.0 2.0 0.5 1.0
0.5 0.0 2.0 0.5 0.0

// C1

-2.0 1.0 -2.0 0.0 1.0
-2.0 0.0 -2.0 0.0 0.0
-2.0 0.0 -0.5 1.5 0.0
-2.0 1.0 -2.0 0.0 1.0
-2.0 1.0 -0.5 1.5 1.0
-2.0 0.0 -0.5 1.5 0.0

// C2

-2.0 1.0 2.0 2.0 1.0
-2.0 0.0 2.0 2.0 0.0
-2.0 0.0 0.5 0.5 0.0
-2.0 1.0 2.0 2.0 1.0
-2.0 1.0 0.5 0.5 1.0
-2.0 0.0 0.5 0.5 0.0

// D1

2.0 1.0 -2.0 0.0 1.0
2.0 0.0 -2.0 0.0 0.0
2.0 0.0 -0.5 1.5 0.0
2.0 1.0 -2.0 0.0 1.0
2.0 1.0 -0.5 1.5 1.0
2.0 0.0 -0.5 1.5 0.0

// D2

2.0 1.0 2.0 2.0 1.0
2.0 0.0 2.0 2.0 0.0
2.0 0.0 0.5 0.5 0.0
2.0 1.0 2.0 2.0 1.0
2.0 1.0 0.5 0.5 1.0
2.0 0.0 0.5 0.5 0.0

// Верхний коридор - L
-0.5 1.0 -3.0 0.0 1.0
-0.5 0.0 -3.0 0.0 0.0
-0.5 0.0 -2.0 1.0 0.0
-0.5 1.0 -3.0 0.0 1.0
-0.5 1.0 -2.0 1.0 1.0
-0.5 0.0 -2.0 1.0 0.0

// Верхний коридор - R
0.5 1.0 -3.0 0.0 1.0
0.5 0.0 -3.0 0.0 0.0
0.5 0.0 -2.0 1.0 0.0
0.5 1.0 -3.0 0.0 1.0
0.5 1.0 -2.0 1.0 1.0
0.5 0.0 -2.0 1.0 0.0

// Нижний коридор - L
-0.5 1.0 3.0 0.0 1.0
-0.5 0.0 3.0 0.0 0.0
-0.5 0.0 2.0 1.0 0.0
-0.5 1.0 3.0 0.0 1.0
-0.5 1.0 2.0 1.0 1.0
-0.5 0.0 2.0 1.0 0.0

// Нижний коридор - R
0.5 1.0 3.0 0.0 1.0
0.5 0.0 3.0 0.0 0.0
0.5 0.0 2.0 1.0 0.0
0.5 1.0 3.0 0.0 1.0
0.5 1.0 2.0 1.0 1.0
0.5 0.0 2.0 1.0 0.0


// Левый коридор - Lw

-3.0 1.0 0.5 1.0 1.0
-3.0 0.0 0.5 1.0 0.0
-2.0 0.0 0.5 0.0 0.0
-3.0 1.0 0.5 1.0 1.0
-2.0 1.0 0.5 0.0 1.0
-2.0 0.0 0.5 0.0 0.0

// Левый коридор - Привет

-3.0 1.0 -0.5 1.0 1.0
-3.0 0.0 -0.5 1.0 0.0
-2.0 0.0 -0.5 0.0 0.0
-3.0 1.0 -0.5 1.0 1.0
-2.0 1.0 -0.5 0.0 1.0
-2.0 0.0 -0.5 0.0 0.0

// Правый коридор - Lw

3.0 1.0 0.5 1.0 1.0
3.0 0.0 0.5 1.0 0.0
2.0 0.0 0.5 0.0 0.0
3.0 1.0 0.5 1.0 1.0
2.0 1.0 0.5 0.0 1.0
2.0 0.0 0.5 0.0 0.0

// Правый коридор - Привет

3.0 1.0 -0.5 1.0 1.0
3.0 0.0 -0.5 1.0 0.0
2.0 0.0 -0.5 0.0 0.0
3.0 1.0 -0.5 1.0 1.0
2.0 1.0 -0.5 0.0 1.0
2.0 0.0 -0.5 0.0 0.0

Jochen Arndt

Я имею в виду то, что читается и что ожидается.

Ваш файл содержит пустые строки и строки, содержащие не пять значений с плавающей запятой. Для этих строк разбитое число может иметь, конечно, разные значения. И код проверяет, являются ли слова значениями с плавающей запятой.

Мое предложение сообщать об ошибке, когда количество строк не равно пяти, было основано на предположении, что файл содержит только "допустимые" строки. Просто не сообщайте об этом, и все должно быть в порядке.

Так в чем же теперь твоя проблема?
С моей точки зрения, он должен работать так, как и ожидалось. То есть: данные добавляются к треугольникам.

Member 13927363

единственная проблема здесь-это линия QStringList линии = в QString::сплит( " ", тр.с readline().simplifyWhiteSpace () ); этот синтаксис должен помочь, чтобы получить 5 числа с плавающей должны быть сохранены для линии [], чтобы быть в состоянии загрузить треугольника, но я не могу выяснить, как. кстати, большое вам спасибо за приложенные усилия.

Jochen Arndt

С моей точки зрения (я не выполнял его), он делает это. Но с Qt5 вы должны использовать QString::simplified().

Поскольку у вас также есть строки, содержащие не пять поплавков, они должны быть пропущены / проигнорированы. Но следующий код делает это.

Если вы не знаете, как это работает, распечатайте промежуточные результаты, как было предложено, или проверьте их с помощью отладчика, а также прочитайте и поймите документацию по используемым функциям.