среда, 17 октября 2012 г.

Чтение данных из файла через QFile

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

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

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

#include <QFile>
#include <QDebug>


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

#include <QByteArray>


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

#include <QString>


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

public:
    void readFile();


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

void MainWindow::readFile()
{
    QFile file("file.txt"); // создаем объект класса QFile
    QByteArray data; // Создаем объект класса QByteArray, куда мы будем считывать данные
    if (!file.open(QIODevice::ReadOnly)) // Проверяем, возможно ли открыть наш файл для чтения
        return; // если это сделать невозможно, то завершаем функцию
    data = file.readAll(); //считываем все данные с файла в объект data
    qDebug() << QString(data); // Выводим данные в консоль, предварительно создав строку из полученных данных
}

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



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

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

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

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

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

    ОтветитьУдалить
  5. Не могу прочесть байты

    файл: mainwindow.h

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



    файл: mainwindow.cpp.

    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, которые читая файл как текст не обнаружишь.

    ОтветитьУдалить
  6. Еще остался без ответа пост "Но к сожалению не читает кирилические символы."
    Тут есть особенность. Текстовый файл может быть не в режиме 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);

    ОтветитьУдалить
  7. А что делать, если выводит просто пустую консоль? В файле цифровой массив. Отрабатывает без ошибок. Не понимаю, что не так. Помогите, пожалуйста!

    ОтветитьУдалить