Это будет первый из нескольких способов чтения данных из файлов. Я постараюсь постепенно усложнять процесс чтения, но при этом будет повышаться эффективность для конкретных задач.
Создадим стандартное 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 указывается имя файла, либо полный путь до файла, который необходимо считать, так что предварительно вам будет необходимо его создать.
Надеюсь закомментировал все наглядно.
Создадим стандартное 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 указывается имя файла, либо полный путь до файла, который необходимо считать, так что предварительно вам будет необходимо его создать.
Надеюсь закомментировал все наглядно.
Да, очень хорошо. Спасибо!
ОтветитьУдалитьДа не за что )
ОтветитьУдалитьмда.. времени, конечно, прошло порядочно, но, может, подскажете?
ОтветитьУдалитькак реализовать средствами Qt чтение без буфера? нужен аналог вот такого кода:
< FILE *f = fopen(str,"r");
setbuf(f,NULL); >
А Qt, как я понимаю, по-умолчанию буфер включает - как отключить -не могу найти. (
Не совсем понимаю что вы хотите от кода.
ОтветитьУдалитьВозможно вам поможет QDataStream?
Спасибо, очень помогло. Но к сожалению не читает кирилические символы. Вы знаете как исправить?
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьНе могу прочесть байты
ОтветитьУдалитьфайл: 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, которые читая файл как текст не обнаружишь.
Еще остался без ответа пост "Но к сожалению не читает кирилические символы."
ОтветитьУдалитьТут есть особенность. Текстовый файл может быть не в режиме 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);
выдает ошибку и находит fromUtf8
УдалитьА что делать, если выводит просто пустую консоль? В файле цифровой массив. Отрабатывает без ошибок. Не понимаю, что не так. Помогите, пожалуйста!
ОтветитьУдалитьФайл не закрыл.
ОтветитьУдалить