Skip to content

Latest commit

 

History

History
170 lines (120 loc) · 9.15 KB

File metadata and controls

170 lines (120 loc) · 9.15 KB

Объектно-ориентированное программирование

ЛР 3. CSV-Writer

В рамках данной лабораторной работы Вам предстоит разработать класс для записи данных об объектах геометрических фигур в CSV-файл, а так же расширить функционал вашего приложения, добавив поля и кнопки для добавления новых фигур, реализовав выбор параметра из enum при помощи QComboBox.

1. Теоретическая справка

1.1 Запись в файл

1.2 QComboBox

2. Задание

3. Ход работы

4. Контрольные вопросы

1. Теоретическая справка

Запись в файл

Один из вариантов обеспечить потоковую запись в файл в языке С++ - использование специализированного класса 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

QComboBox - это виджет, который содержит в себе список элементов. Для того чтобы поместить его на форму, в редакторе формы найдите раздел input widgets -> ComboBox и перетащите его.

Для того чтобы добавить в него содержимое, нажмите по нему ПКМ -> Изменить элементы -> +.

Для того чтобы получить выбранное в QComboBox содержимое непосредственно в коде, воспользуйтесь методом CurrentText:

QString content = ui->QComboBoxName->currentText();

2. Задание

В рамках данной лабораторной работы нужно модифицировать ui форму, добавив возможность добавлять фигуры в вектор, а не только считывать их. Реализовать выбор из enum требуется с использованием виджета QComboBox. Вместе с этим нужно добавить функционал записи новых данных в .csv файл, реализовать его нужно при помощи класса записи CSVWriter.

3. Ход работы

  1. Добавьте lineEdit-ы для записи каждого свойства фигуры, для выбора цвета новой фигуры используйте QComboBox. Разместите кнопку для записи всех данных из вектора в файл.

  2. Реализуйте класс 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; // Разделитель ; обязателен
}

4. Контрольные вопросы

  1. Что такое fstream и для чего он используется?

  2. Что делает метод is_open() и какого его применение на практике?

  3. Как производить запись в файл через объект класса fstream?

  4. Опишите общий алгоритм безопасной записи в файл.

  5. В чем преимущество использования отдельного класса для записи в файл?