Передать в константу значение в зависимости от выбранного пользователем пункта
Необходимо, чтобы в зависимости от выбранного пользователем материала функция возвращала значение из файла. Есть код:
double MainWindow::on_choose_clicked()
{
QString func = ui->material->currentText(); //Передаём в константу выбранный пользователем материал
QFile file("Materials.txt");
QStringList strList;
int n;
if (func == "Медь")
{
n = 1;
}
else if (func == "Алюминий")
{
n = 2;
}
else //(func == "Железо")
{
n = 3;
}
if (file.open(QIODevice::ReadOnly))
{
while(!file.atEnd())
{
strList << file.readLine();
}
strList[n];
}
file.close();
return strList[n].toDouble();
}
Но он выдаёт ошибку. Подскажите пожалуйста, что я делаю не так, и есть ли способ реализовать это аккуратнее.
Сама ошибка:
В файле записаны на данный момент три константы, каждая в свой строке. Кроме цифр в них ничего нет.
Ответы (2 шт):
Подозреваю, основная проблема в том, что вы индексируете с единицы, тогда как в листе (как и во всех других контейнерах) индексация начинается с нуля. Проверьте в дебаггере, какой индекс вы пытаетесь взять и существует ли элемент с таким индексом в листе.
В целом же ваш код имеет несколько фундаментальных недостатков:
- Вы привязываете материал к параметрам по строке;
- Вы читаете список параметров материалов из файла при каждом изменении текущего материала;
- Вы храните список материалов прибитым гвоздями в выпадающем списке, а параметры в файле. При этом изменение в файле потребует изменения интерфейса, увеличивая шанс посадить ошибку;
Как бы сделал я:
- Вытащил бы название материала в файл, записывая пары значений название - параметр с каким-то разделителем, допустим, знаком табуляции;
- Считал бы все пары один раз из файла при старте программы и заполнил выпадающий список;
- При изменении текущего элемента выпадающего списка взял бы соответствующий элемент из справочника материалов (используя
ui->material->currentIndex()и вытащил из него нужный параметр.
- Вся индексация в C++ и С идет, начиная с нуля. n = 1 и далее замените на n = 0.
Замечания:
Что делает строка strList[n] в конце блока if? Уберите мусор.
file.close(); поместить внутрь блок if (file.open(QIODevice::ReadOnly)), он ведь не должен выполняться, если файл не откроется.
добавьте после блока if блок else и в нем для ошибки открытия файла обработайте ошибку. Хотя бы выбросьте исключение throw Exception("Невозможно открыть файл").
strList << file.readLine(); лучше заменить на более читаемое append .