Qt как qstring записать в файл

Обновлено: 04.07.2024

В качестве фундаментального типа данных, QTextStream использует QChar. В дополнение к символьным и строковым данным, QTextStream поддерживает базовые числовые типы языка C++, конвертируя их в/из строки.

С целью демонстрации возможностей QTextStream, продолжим рассмотрение реализации класса Gallery. Ниже приводится исходный текст функции saveText(), которая сохраняет список картин в простой текстовый файл:

При открытии файла используется флаг IO_Translate, чтобы корректным образом перевести символ перевода строки в последовательность символов, которая соответствует используемой операционной системе ("/r/n" -- для Windows, "/r" -- для Mac OS X). Затем устанавливается кодировка символов UTF-8, совместимая с ASCII. (За дополнительной информацией об Unicode, см. Главу 15.) После этого, в цикле, в файл выводятся описания картин, с помощью перегруженного оператора "<<": При записи сведений о картине, в качестве разделителя полей, используется символ двоеточия. Каждая запись в файле завершается символом перевода строки. При этом мы исходим из предположения, что ни имя художника, ни название картины не содержат символов двоеточия или перевода строки.

Ниже показан пример содержимого файла, созданного функцией saveText():

Теперь перейдем к функции чтения файла: Все самое интересное в этой функции, заключено внутри цикла while. Он выполняет чтение данных, с помощью оператора ">>", до тех пор, пока не будет достигнут конец файла.

Реализация оператора ">>" не так тривиальна, поскольку представление текстовых данных не так однозначно. Рассмотрим следующий пример:

Если исходить из того, что out -- это экземпляр класса QTextStream, то в файл фактически будет записана одна строка "alphabravo". Мы не сможем прочитать данные, просто написав: Фактически, в переменную str1 будет записана строка "alphabravo", а в переменную str2 -- ничего.

Если записываемый текст состоит из отдельных слов, мы можем вставлять пробелы между ними и затем читать этот текст слово за словом. (Этот подход был реализован в функциях DiagramView::copy() и DiagramView::paste(), в Главе 8.) Но в данном случае этот вариант не подходит, поскольку имя художника и название картины могут состоять более чем из одного слова. Поэтому, за один раз читается целая строка и затем разбивается на элементы, с помощью функции QStringList::split() :

Считывание файла за раз может оказаться удобным решением, если данные должны пройти предварительную обработку, например:

Чтобы записать данные в файл за одно обращение, можно сначала разместить их в переменной, а затем вывести на диск: Связать поток со строковой переменной так же просто, как и связать поток с файлом. Запись текстовых данных -- довольно простая операция, а вот чтение их может оказаться довольно сложной задачей. В случае использования сложных форматов может потребоваться написать полноценный синтаксический анализатор. Как правило, подобные анализаторы считывают текст символ за символом, с помощью оператора ">>" в переменную типа QChar или построчно, с помощью readLine() и затем анализируют полученную строку.

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

На сегодняшний день подавляющее большинство компьютерных программ работают с файлами, а поэтому важно уметь пользоваться функциями или классами, которые позволяют открывать и закрывать, записывать и считывать информацию из файлов. В этой статье я немного расскажу о файлах и о классе 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 для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

На этом уроке мы рассмотрим работу с файлами и каталогами в 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

Мне нужно найти чистый и быстрый способ записать QString в .csv файл. Я пытался:

Но он пишет для меня ". " в myfile.csv

1 ответ

Поскольку Андрей еще не отреагировал, я поделюсь и расскажу немного о проблеме с OP:

Класс QString предоставляет строку символов Юникода.

QString хранит 16-битную строку QChar s, где каждый QChar соответствует одному символу Unicode 4.0. (Символы Юникода с кодовыми значениями выше 65535 сохраняются с использованием суррогатных пар, т. Е. Двух последовательных QChar с.)

Записывает строку string в поток и возвращает ссылку на QTextStream. Сначала строка кодируется с использованием назначенного кодека (кодек по умолчанию - QTextCodec :: codecForLocale ( )) перед записью в поток.

Итак, ". " , вероятно, Hello, World! закодирован в UTF-16 или UTF-32, где инструмент просмотра OP (который выводил ". " ) был не может это обнаружить или даже не поддерживает эту кодировку.

Совет Андрея Семенова сделать вместо этого:

Преобразует содержимое QString в UTF-8, который

  • состоит из байтов
  • идентичен ASCII в отношении первых 127 символы ASCII.

Итак, Hello, World! состоит только из символов, доступных в таблице ASCII (с кодами

Кстати. чтобы узнать, какая кодировка была на самом деле ". " , myfile.csv можно было просмотреть с помощью инструмента шестнадцатеричного представления. Поскольку входные данные известны, кодировку, вероятно, можно вывести из выходных данных. (Например, a He - это 0x48 0x65 в ASCII и UTF-8, но 0x48 0x00 0x65 0x00 в UTF-16LE и 0x00 0x48 0x00 0x65 в UTF-16BE.)

Я попытался воспроизвести проблему с помощью MCVE.

Итак, похоже, я не могу воспроизвести на своей стороне то, что описал OP. Я также попробовал это с кодом, скомпилированным и запущенным в VS2013:

(Скомпилировать, запустить в VS2013)

Опять же, я не могу воспроизвести. Было бы интересно посмотреть, как OP создает ". " и что он на самом деле содержит.

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