В рамках данной лабораторной работы Вам предстоит разработать класс для записи данных об объектах геометрических фигур в CSV-файл, а так же расширить функционал вашего приложения, добавив поля и кнопки для добавления новых фигур, реализовав выбор параметра из enum при помощи QComboBox.
Один из вариантов обеспечить потоковую запись в файл в языке С++ - использование специализированного класса fstream
.
Для его использования необходимо добавить следующую директиву:
#include <fstream>
Алгоритм записи информации в файл весьма простой. Необходимо:
-
Открыть файл;
-
Произвести запись данных любым доступным способом (например, через цикл);
-
Закрыть файл.
Преждем чем работать с файлом, необходимо создать объект класса ofstream:
std::ofstream fout;
Обычно, объект вывода называют fout, но Вы можете дать ему любое имя. Этот объект будет служить неким переходником между системой вводом-вывода и вашим файлом.
Теперь, когда объект создан, можно открыть файл, воспользовавшись методом open
у объекта fout
. В качестве параметра передается название файла, в в который будет производиться запись:
fout.open("database.csv")
Для того чтобы не "хардкодить" название файла (hardcode - прописывание значение каких-либо данных прямо в коде, вместо того, чтобы передавать их параметром), лучше будет подставлять название файла непосредственно при передаче его названия в качестве параметра. Для этого можно воспользоваться следующей конструкцией:
QString filemame; // Может меняться в коде динамически
fout.open(filename.toLatin1().data());
Теперь функция привязана не к жестко заданному значению, а к параметру filename с типом QString , который при помощи методов .toLatin1().data() приводится к необходимому формату.
Перед тем, как производить запись, необходимо проверить, открылся ли файл. Ниже приведен стандартный паттерн, используемый для данной проверки. Функция is_open
возвращает true
, если файл открыт успешно, иначе false
:
std::ofstream fout("schedule_database_output.csv");
if(!fout.is_open()) { // Проверка, открылся ли файл на запись:
std::cout << "Error! File is not open" << std::endl;
} else {
... // Логика записи в файл
}
Для того чтобы записать что-либо в файл к обьекту класса fstream применяется оператор <<
, после чего указывается то, что должно быть записано в файл. Оператор <<
можно использовать несколько раз последовательно:
name = "student";
fout << "Hello, " << name << "!" << std::endl; // endl переносит на след. строку в файле
fout << "12345";
После этого в файле появятся следующие строчки:
Hello, student!
12345
Если вам необходимо записать в файл не одну строчку, а, скажем, данные их из вектора, то организуйте цикл:
for (int i = 0; i < int(vec.size()); i++) {
fout << vec[i] << std::endl;
}
После того, как работа с файлом окончена, необходимо закрыть файл при помощи метода close
:
fout.close();
Итоговая структура кода для записи в файл:
QString filename = "database.csv";
fout.open(filename.toLatin1().data()); // Открываем файл
if (!fout.is_open()) { // Проверка, открылся ли файл:
std::cout << "Error! File is not open" << std::endl;
} else {
for (int i = 0; i < int(vec.size()); i++) {
fout << vec[i] << std::endl;
}
}
fout.close();
QComboBox - это виджет, который содержит в себе список элементов. Для того чтобы поместить его на форму, в редакторе формы найдите раздел input widgets -> ComboBox и перетащите его.
Для того чтобы добавить в него содержимое, нажмите по нему ПКМ -> Изменить элементы -> +.
Для того чтобы получить выбранное в QComboBox содержимое непосредственно в коде, воспользуйтесь методом CurrentText
:
QString content = ui->QComboBoxName->currentText();
В рамках данной лабораторной работы нужно модифицировать ui
форму, добавив возможность добавлять фигуры в вектор, а не только считывать их. Реализовать выбор из enum требуется с использованием виджета QComboBox.
Вместе с этим нужно добавить функционал записи новых данных в .csv
файл, реализовать его нужно при помощи класса записи CSVWriter.
-
Добавьте lineEdit-ы для записи каждого свойства фигуры, для выбора цвета новой фигуры используйте QComboBox. Разместите кнопку для записи всех данных из вектора в файл.
-
Реализуйте класс CSVWriter, обеспечивающий запись данных из вектора с фигурами в файл. Класс должен содержать в себе поле с обьектом fstream, метод-проверка открытия файла, метод для записи всех данных из вектора с фигурами. Примерный шаблон `.h' файла имеет следующий вид:
class CSVWriter
{
public:
CSVWriter(...);
~CSVWriter(...);
bool isOpen() const { return fout.is_open(); }
void writeAll(std::vector<Figures> vec);
private:
std::ofstream fout; // Обьект потокового вывода
};
Подумайте, что должно быть у него в конструкторе и деструкторе.
Для записи в файл CSV используется следующий формат:
for (...) {
fout << data1 << ";" << data2 << ";" << std::endl; // Разделитель ; обязателен
}
-
Что такое fstream и для чего он используется?
-
Что делает метод is_open() и какого его применение на практике?
-
Как производить запись в файл через объект класса fstream?
-
Опишите общий алгоритм безопасной записи в файл.
-
В чем преимущество использования отдельного класса для записи в файл?