Qfile как пользоваться
Перейти к содержимому

Qfile как пользоваться

Qt коддинг

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

Создадим стандартное 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?

Спасибо, очень помогло. Но к сожалению не читает кирилические символы. Вы знаете как исправить?

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

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

#include [QFile]// все как положено (здесь угловые скобки не позволяют сорри)
#include [QByteArray]// ага.
.
public:
explicit
.
int n;// еще вот эту переменную объявим

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!*/

теперь n можно анализировать (если обрабатываете бинарный, не текстовый файл), а я искал в файлах байты перевода строки #0D, #0A, которые читая файл как текст не обнаружишь.

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

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

а для текстовых переменных:
string1 = ". кусок текста в кодировке UTF8"
string2 = string1.fromUTF8();// но string2 должна быть cp1251, т.е. не UTF8
/* или */
string2 = QString::fromUtf8(string1);

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

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