Теперь мы реализуем загрузку и сохранение файла данных для приложения Электронная таблица, используя двоичный пользовательский формат. Для этого мы используем объекты
Мы начнем с записи файла данных Электронная таблица:
01 bool Spreadsheet::writeFile(const QString &fileName)
02 {
03 QFile file(fileName);
04 if (!file.open(QIODevice::WriteOnly)) {
05 QMessageBox::warning(this, tr("Spreadsheet"),
06 tr("Cannot write file %1:\n%2.")
07 .arg(file.fileName())
08 .arg(file.errorString()));
09 return false;
10 }
11 QDataStream out(&file);
12 out.setVersion(QDataStream::Qt_4_1);
13 out << quint32(MagicNumber);
14 QApplication::setOverrideCursor(Qt::WaitCursor);
15 for (int row = 0; row < RowCount; ++row) {
16 for (int column = 0; column < ColumnCount; ++column) {
17 QString str = formula(row, column);
18 if (!str.isEmpty())
19 out << quint16(row) << quint16(column) << str;
20 }
21 }
22 QApplication::restoreOverrideCursor();
23 return true;
24 }
Функция
Мы создаем объект
Непосредственно перед записью данных мы изменяем курсор приложения на стандартный курсор ожидания (обычно он имеет вид песочных часов) и затем восстанавливаем нормальный курсор после окончания записи данных. В конце функции файл автоматически закрывается деструктором
QDataStream поддерживает основные типы С++ совместно со многими типами Qt. Их синтаксис напоминает синтаксис классов
out << x << у << z;
выполняет запись в поток значений переменных
in >> x >> у >> z;
считывает их из потока. Поскольку базовые типы С++, такие как
Файл данных Электронная таблица имеет очень простой формат. Он начинается с 32-битового числа, идентифицирующего формат файла («волшебное» число
Точное представление типов данных определяется в