Работа с текстовыми файлами в Qt

В библиотеке Qt работа с файлами вообще и текстовыми в частности реализована с помощью класса QFile.

В качестве параметра при создании объекта этого класса передаётся путь к нужному файлу.

После того как объект QFile создан, необходимо открыть файл с помощью метода open. Это метод принимает в качестве параметра режим открытия файла.

Запись в текстовый файл

После открытия текстового файла в режиме записи в него можно записать нужные данные при помощи метода write. После окончания записи файл необходимо обязательно закрыть при помощи метода close.

В данном примере, в случае успешного открытия файла в режиме записи в него будут записаны две строки. Если записываемый файл не существует, он будет создан. В противном случае он будет перезаписан.

Важно отметить, что метод write самостоятельно не добавляет разрыв строки и потому эта задача ложится на плечи программиста.

Чтение из текстового файла

Перед тем как приступить к чтению файла, его необходимо открыть в соответствующем режиме с помощью метода open. Также перед открытием файла для чтения необходимо убедиться в его существовании. Это можно сделать при помощи метода exists (если файл существует, он возвращает true).

Для построчного чтения из текстового файла у класса QFile предусмотрен специальный метод readLine. Этот метод считывает из файла строку в начале которой в данный момент находится указатель и перемещает его в начало следующей строки.

Чтобы при чтении по ошибке позиция указателя не оказалась «за пределами» файла необходимо проверять является ли позиция указателя концом файла. Для этого служит метод atEnd, который возвратит true, когда конец файла будет достигнут. В противном случае он возвратит false.

После чтения данных из файла его также следует закрыть с помощью метода close.

Ниже приведён пример построчного чтения текстового файла.

Если необходимо прочитать весь файл целиком, можно значительно упростить реализацию воспользовавшись методом readAll.

Чтение и запись отдельной строки

Самыми сложными и одновременно не оптимизированными операциями при работе с текстовыми файлами в Qt, является чтение и запись одной конкретной строки. Дело в том, что QFile не поддерживает навигацию по строкам и следовательно обратиться напрямую к заданной строке нельзя.

Данное неудобство в принципе можно считать своеобразной платой за универсальность, но сути это не меняет.

Чтобы получить доступ к требуемой строке для чтения необходимо воспользоваться одним из двух способов:

  • Предварительно «прочитать» все предыдущие строки.

  • Прочитать содержимое файла в контейнер, который поддерживает доступ по индексу и получать нужные данные уже из него.

При использовании контейнеров следует обязательно читать текстовый файл построчно. В случае чтения при помощи метода readAll символы перевода строки игнорируются и содержимое файла будет загружено в контейнер целиком в виде одного единственного элемента.

Запись отдельной строки лучше всего производить посредством контейнера.

Для этого необходим вначале прочитать файл как было показано выше, а затем вставить строку на нужную позицию в контейнере и записать его содержимое обратно в файл.

В качестве примера можно привести добавление новой строки между второй и третьей строками исходного файла.

Аналогичным способом можно отредактировать любую из уже имеющихся строк:

Или удалить:

Идеальное решение — правка содержимого текстового файла в виджете для редактирования (например, Plain Text Edit), но, как известно далеко не всегда текстовые файлы служат для нужд пользователя. Очень часто их приходится использовать для хранения служебной информации связанной с работой программ.

Поэтому несмотря на всю сложность подобных манипуляций программисты вынуждены иногда к ним прибегать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *