Qfile как открыть файл

Обновлено: 07.07.2024

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

Создадим стандартное Gui приложение Qt с названием fileReading.
На выходе получим 5 файлов:
fileReading.pro - файл проекта;
mainwindow.h - заголовочный файл главного окна;
mainwindow.cpp - файл исходных кодов главного окна;
main.cpp - main.cpp :);
mainwindow.ui - файл формы главного окна.

Итак, в файле mainwindow.h подключаем QFile для работы с файлами и QDebug дабы выводить считанную информацию в консоль.

Также нам потребуется QByteArray , который нам будет возвращать класс QFile .

Ну и конечно же класс строки, без которого не обходится ни одна GUI программа.

В этом же файле объявим функцию для чтения из файла:

Теперь переходим в mainwindow.cpp. В этом файле определим нашу функцию.


В конструкторе file указывается имя файла, либо полный путь до файла, который необходимо считать, так что предварительно вам будет необходимо его создать.
Надеюсь закомментировал все наглядно.

10 комментариев:

Да, очень хорошо. Спасибо!

мда.. времени, конечно, прошло порядочно, но, может, подскажете?
как реализовать средствами Qt чтение без буфера? нужен аналог вот такого кода:
< FILE *f = fopen(str,"r");
setbuf(f,NULL); >
А Qt, как я понимаю, по-умолчанию буфер включает - как отключить -не могу найти. (

Не совсем понимаю что вы хотите от кода.
Возможно вам поможет QDataStream?

Этот комментарий был удален автором.

Не могу прочесть байты

QFile file("d:\\file.txt");/* выбрали файл, переменая "file" теперь за все отвечает. да два слеша обязательно!)) */
QByteArray n file.read(1);/* читаем в переменную n по одному байту - (1)*/

и вот далее я не могу эту "n" использовать, пусто. Берет как Hex как Char, но не как Int, даже Byte такого типа не нашел (чтобы n.fromByte();)
__________________________

В общем, сам отыскал =) вдруг кому приргодится

Создаем еще строковую, текстовую переменную (там, в "explicit", mainwindow.h)
QString s;

теперь идем в mainwindow.cpp и пишем

QByteArray str = file.read(1).toHex();/* прочитали байт как Hex-число в строку */
n = str.toInt();/* преобразовали его в байт, в целое число. ну, был байт 13, а в хэксе он 0D и вот она из 0D опять в 13 перевела, жаль, что сразу нельзя 13 получить в Int!*/

Еще остался без ответа пост "Но к сожалению не читает кирилические символы."
Тут есть особенность. Текстовый файл может быть не в режиме cp1251, или там koi-8, а в юникоде, т.е. UTF8. Это значит, что теперь все нац.символы кодируются в два байта. Скажем, раньше за русскую букву "ю" отвечал байт 209, а теперь будут отвечать 209 и 142 и читать их следует парой). Если прочесть по-байтно, то первый символ будет считаться управляющим и в тексте его программа не разместит. Либо выскочит абракадабра, либо вопросики, или вообще ничего. Но тут еще препятствие - BOM.
Надо прочитать начало текстового файла и выяснить наличие этого BOM, оy сообщает, что сейчас символы пойдут парами, хотя есть UTF8 и без bom.
Вообще, чтобы так уж не "запариваться", лучше прочесть все в текстовую переменную (если файл небольшой) иkb выполнить что-то вроде:

QTextStream in(&inFile);// откуда читаем
QTextStream out(&outFile);// куда записываем
out.setCodec("UTF-8");// пишем в юникод

На этом уроке мы рассмотрим работу с файлами и каталогами в Qt5. Для этого мы будем использовать следующие классы:

QFile , QDir и QFileInfo — основные классы для работы с файлами в Qt5;

QFile — предоставляет интерфейс для чтения и записи информации в файлы;

QDir — обеспечивает доступ к структуре каталогов и к их содержимому;

QFileInfo — предоставляет информацию о файле, включая его имя и расположение в файловой системе, время доступа и изменения, имя владельца файла и текущие разрешения.

Размер файла

Для определения размера файла в классе QFileInfo предусмотрен метод size():

// Имя файла передается в качестве аргумента в нашу программу qWarning ( "The file does not exist" ) ; // если файл не найден, то выводим предупреждение и завершаем работу программы qint64 size = fileinfo . size ( ) ; // qint64 - это тип данных, который гарантированно будет 64-битным на всех платформах, поддерживаемых Qt

Для запуска программы проделайте следующие шаги:

ПОДГОТОВКА:

Шаг №1: Скомпилируйте вашу программу. Для этого выберите в меню "Сборка" > "Собрать всё" (или нажмите Ctrl+Shift+B ).

Шаг №2: Зайдите в папку, где лежит ваш Qt-проект (у меня он расположен в C:\dev\Qt_Project ).

Шаг №3: После выполнения первого шага у вас должна появиться еще одна папка, в которой будет создан исполняемый файл программы. Т.к. я использую компилятор MinGW 32-bit и режим компиляции Debug, то при компиляции проекта Qt автоматически создал папку build-My_QtApplication-Desktop_Qt_5_13_0_MinGW_32_bit-Debug .

Шаг №4: Зайдите в папку debug (она находится внутри папки, созданной на шаге №3).

Шаг №5: Найдите *.exe-файл вашей программы (у меня это file_size.exe ).

Шаг №6: Скопируйте этот файл в папку к соответствующему компилятору (напомню, т.к. я использовал компилятор MinGW 32-bit, то у меня этот путь выглядит следующим образом: C:\Soft\Qt\5.13.0\mingw73_32\bin ).

ЗАПУСК ПРОГРАММЫ:

Шаг №7: Откройте командную строку.

Шаг №8: Перейдите в папку, указанную в шаге №6 ( cd C:\Soft\Qt\5.13.0\mingw73_32\bin ).

Шаг №9: Запустите свою программу, передав ей в качестве параметра имя любого файла (у меня этим файлом оказалась эта же программа, поэтому в моем случае команда была следующей: file_size.exe file_size.exe ).

Результат выполнения программы:



Чтение содержимого файлов

Для того, чтобы прочитать содержимое файла, мы должны сначала открыть этот файл в режиме чтения, затем создать входящий файловый поток, из которого мы будем считывать данные. В примере, приведенном ниже, мы считываем данные из файла C:\colours.txt . Файл содержит названия семи цветов, вот его содержимое:

Red
Green
Black
Yellow
Purple
Blue
White

Пингвин читает содержимое файла

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

Полное имя файла, дерево файловой системы.

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

Если мы хотим обратиться к файлу /text.txt, находясь в директории /etc/, то необходимо писать ../text.txt

Если к файлу в текущей директории, то text.txt или ./text.txt

Обычно, когда говорят об имени файла, то подразумевают ту часть, где опущен полный путь к нему, т.е. просто file.txt. Путь к файлу и полное имя файл понятия взаимозаменяемые.

Более подробную информацию о файлах можно найти в сети.

Обратите внимание, что на сайте имеется очень похожая статья статья про реализацию чтения из файлов на C++, но без использования фреймворка Qt.

Класс QFile наследует класс QIODevice, который для работы с файлами предоставляет методы: открытия и закрытия файлов, для записи и чтения из файла, для создания и удаления файлов.

Чтобы создать объект для работы с файлом, нужно передать в конструктор имя файла.

Можно не передавать имя файла в конструктор, а установить его в объекте методом setName().

Часто при работе с файлами требуется узнать, открыт ли файл. Метод QIODevice::isOpen() возвращает значение true, если файл открыт и false в противном случае. А так как QFile унаследован от него, то мы можем проверить, открыт ли файл.

Для закрытия файла нужно вызвать метод QFile::close()

Обратите внимание, что данные сразу не записываются в файл на накопителе, они записываются в буфер в оперативной памяти. После закрытия файла данные из буфера записываются в файл на носителе. Это сделано для того, чтобы не нагружать жесткий диск или любой другой тип накопителя, на котором находится файл. Информацию из буфера в файл можно записать принудительно без закрытия файла, вызвав метод QFile::flush()

Существует очень полезный метод QFile::exists(). Он принимает на вход строку с именем файла и возвращает значение true, если такой файл существует. Существует статический и нестатический методы. Для работы со статическим методом необходимо указать имя файла.

Для работы с нестатическим достаточно просто его вызвать.

Для возможности записи или чтения необходимо открыть файл с указанием флага чтения QIODevice::ReadOnly или записи QIODevice::WriteOnly. Пример открытия файла для записи:

Есть разные способы чтения из фалов и записи. Можно считать или записать всю информацию за один раз, а можно по одному символу или блоками.

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

Я создал файл filein.txt и внёс в него произвольный текст с помощью текстового редактора. После запуска программы я открыл filein.txt и fileout.txt в текстовом редакторе.

Первые 10 символов

Первые 10 символов

Можно было считать все байты, тогда всё содержимое первого файла копировалось во второй. Для полного считывания строку

Нужно заменить на строку

В результате программа считает все байты в массив block, а после запишет их во второй файл.

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

После передать адрес в конструктор нового объекста класса QTextStream.

А далее при помощи оператора << посылать строки в поток записи.

Содержимое fileout.txt после запуска программы

Содержимое файла fileout.txt

Содержимое файла fileout.txt

Запись в конец файла

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

Флаг QIODevice::Append помещает указатель для записи (seek) в конец файла, в итоге входящий поток записывается сразу после имеющейся информации в файле. Пример фрагмента использования:

В примере вместо QIODevice::WriteOnly используется QIODevice::Append. Если сделать такое изменение в предыдущей программе, то после нескольких запусков в файле fileout.txt будет храниться строчка

Text, text, text.Text, text, text.Text, text, text.

Итак, мы рассмотрели основные методы для работы с файлами. Более подробную информацию обо всех методах класса QFile и QIODevice можно найти в официальной документации Qt и в сети.

Для вас это может быть интересно:

QFile и файлы. Чтение и запись строк в файл. : 4 комментария

Помогло разобраться с классом, хорошо изложено! 🙂

Не понимаю, где будут сохраняться эти файлы

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Здравствуйте, нужно распарсить xml файл, почитал документацию, остановился на QXmlStreamReader.

Но столкнулся с проблемой, что не хочет открываться файл, лежащий в той же директории, что и исходники.
Все собирается, но при попытки начать парсить вылазит ошибка: Couldn't open input.osm
Привожу код: (судя по всему что-то не так в строках 23-27

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


QFile открытие файла с конкатенацией
Доброго времени суток. Есть такой код, он отрабатывает, и нормально открывает файл и пишет.


Чтение и запись файла используя класс QFile
Всем доброго здравия! Пытаюсь работать с устройством /dev/usbtmc1 (linux xubuntu), которое.

Открытие и чтение PDF-файла
Нужно написать код программы для открытия и чтения pdf файла в eclipse

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

Возможно синтаксическая ошибка?

if (!file->open(QIODevice::ReadOnly|QIODevice: ; Text))

Возможно синтаксическая ошибка?

if (!file->open(QIODevice::ReadOnly|QIODevice: ; Text))

Тот же самый результат
Система Mac OS. Qt 5.0.1. Сейчас попробую под виндой собрать

Добавлено через 8 минут
Под виндой собирается и, вроде, файл открывается, но при начале парсинга xmlReader, когда считывает эелементы упирается в ошибку: Permature end of document
т.е в цикл она заходит всего один раз и на первой же проверке вылетает из него(

А что интересно будет, если Ваш файл открыть в браузере или в какой-нибудь xml-читалке, предварительно поменяв расширение на xml? А что интересно будет, если Ваш файл открыть в браузере или в какой-нибудь xml-читалке, предварительно поменяв расширение на xml? Значит все таки Qt не открывает файл как положено. Я думаю проблема может быть связана с кодировками. Значит все таки Qt не открывает файл как положено. Я думаю проблема может быть связана с кодировками. Насколько я знаю - нет, но можно поэкспериментировать c QTextCodec::setCodecForLocale() для начала укажите файлу полный путь, собираете вы приложение в той же директории где и исходники ? для начала укажите файлу полный путь, собираете вы приложение в той же директории где и исходники ?

Да, в той же где и исходники.

Проблема решилась простым изменением расширения у файла: .osm заменил на .xml и все прекрасно заработало, но остался вопрос, связанный с тем, что неужели QXmlStreamReader/Writer работают с файлами, расширение которых искулючительно .xml ? В документации не обнаружил. Хотя есть предположение, что не reader/writer дело, может еще QFile не знает такого расширения, что очень странно, ввиду того, что ему должно быть все равно на расширение.
Никто не сталкивался с такой войной расширений ?

Читайте также: