Шаг 89.
Библиотека Qt.
Работа с файлами. Класс QFile

    На этом шаге рассмотрим класс QFile.

    Класс QFile унаследован от класса QIODevice. В нем содержатся методы для работы с файлами: открытия, закрытия, чтения и записи данных. Создать объект можно, передав в конструкторе строку, содержащую имя файла. Можно ничего не передавать в конструкторе, а сделать это после создания объекта вызовом метода setName(). Например:

QFile file("file.dat");

или

QFile file;
file.setName("file.dat");

    В процессе работы с файлами иногда требуется узнать, открыт файл или нет. Для этого вызывается метод QIODevice::isOpen(), который вернет значение true, если файл открыт, иначе — false.

    Чтобы закрыть файл, нужно вызвать метод close(). С закрытием осуществляется запись всех данных буфера. Если требуется выполнить запись данных буфера в файл без его закрытия, то вызывается метод QFile::flush().

    Проверить, существует ли нужный вам файл, можно статическим методом QFile::exists(). Этот метод принимает строку, содержащую полный или относительный путь к файлу. Если файл найден, то метод возвратит значение true, в противном случае — false. Для проведения этой операции существует и нестатический метод QFile::exists(), который проверяет существование файла, возвращаемого методом fileName().

    Методы QIODevice::read() и QIODevice::write() позволяют считывать и записывать файлы блоками.

    Если требуется считать или записать данные за один раз, то используют методы QIODevice::write() и QIODevice::readAll(). Все данные можно считать в объект класса QByteArray, а потом записать из него в другой файл.

    Для удаления файла класс QFile содержит статический метод remove(). В этот метод необходимо передать строку, содержащую полный или относительный путь удаляемого файла.

    Продемонстрируем применение некоторых методов работы с файлами. Рассмотрим следующий пример. Даны два файла f1.dat и f2.dat. Необходимо записать в файл f3.dat первые 5 символов из файла f1.dat, а затем первые 5 символов из файла f2.dat, и в завершении дописать содержимое файла f1.dat в конец файла f2.dat. Реализация этого примера приведена на рисунке 1.


Рис.1. Пример работы с файлами

//создаем три объекта класса QFile, передав в конструкторе
//строку, содержащую имя файла
QFile f1("f1.dat");
QFile f2("f2.dat");
QFile f3("f3.dat");
//если файл f2 создан, то
if (f2.exists())
{   //если файл f2 нельзя открыть для чтения, то
    if (!f2.open(QIODevice::ReadOnly))
    {   //выводим сообщение об ошибке
        qDebug() << "Ошибка открытия для чтения";
    }
    //иначе
    else
    {   //выводим строку F2.DAT
        qDebug()<<"F2.DAT";
        //используя функцию, рассмотренную на предыдущем шаге,
        //выводим содержимое файла F2.DAT на экран
        print(&f2);
    }
}
//если файл f2 не создан, то выводим соответствующее сообщение
else qDebug() << "Файла F2.DAT нет!";
if (f1.exists())
{
    if (!f1.open(QIODevice::ReadOnly))
    {
        qDebug() << "Ошибка открытия для чтения";
    }
    else
    {
        qDebug()<<"F1.DAT";
        print(&f1);
    }
}
else qDebug() << "Файла F1.DAT нет!";
if (f2.exists() && f1.exists())
{   //открываем файлы для чтения
    f1.open(QIODevice::ReadOnly);
    f2.open(QIODevice::ReadOnly);
    //открываем файл для записи
    f3.open(QIODevice::WriteOnly);
    char a[5];
    //читаем из файла f1 первые 5 символов в массив а
    //nBlocksize содержит количество реально прочитанных байтов
    int nBlocksize = f1.read(a, sizeof(a));
    //записываем в файл f3 5 символов массива а
    f3.write(a, nBlocksize);
    nBlocksize = f2.read(a, sizeof(a));
    f3.write(a, nBlocksize);
    //меняем текущее положение в файле f1 на начало файла
    f1.seek(0);
    f2.close();
    //открываем файл для добавления данных
    f2.open(QIODevice::Append);
    //читаем все содержимое из файла f1
    QByteArray b= f1.readAll();
    //дописываем содержимое массива b в конец файла f2
    f2.write(b);
}
//закрываем файлы
f1.close();
f2.close();
f3.close();
//далее выводим содержимое файлов на экран

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим класс QBuffer.




Предыдущий шаг Содержание Следующий шаг