Russian Qt Forum

Qt => Вопросы новичков => Тема начата: skytrain от Сентябрь 25, 2013, 21:53



Название: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 25, 2013, 21:53
Доброго времени суток
Просьба камнями не кидать.
Подскажите пожалуйста, почему длинна array равна 0

Пытаюсь считать файл побайтно. В каждом байте по одному символу неизвестной кодировки. Структура файла - последовательность байтов.
Считать бы хоть что-то....

Код:
QString dbg;
    dbg=currentDir.currentPath() + "/" + ui->comboFile->currentText();
    qDebug() << dbg;
    QFile target(dbg);
    target.open(QIODevice::ReadOnly);
    qDebug()<< target.permissions();
    if (target.open(QIODevice::ReadOnly))
       { return; }
    else
    {
        QByteArray array(target.read(20));
        char data[25];
     int d=1;
     while (d<10)
     {
         qDebug()<< array.size();
         data[d] = array.at(d);
         qDebug() << data[d];
     }
     }


Название: Re: Побайтовое чтение файла
Отправлено: Bepec от Сентябрь 25, 2013, 21:59
А давайте  посмотрим на код и... По коду выходит, если вы открываете файл, то делаете return. А если не открываете - пытаетесь считать :D

PS восклицательный знак забыли :D



Название: Re: Побайтовое чтение файла
Отправлено: Alex Custov от Сентябрь 25, 2013, 22:00
зачем открывать файл дважды? Индексация массива начинается с 0, а не с 1. Индекс d нигде не увеличивается, то есть идёт бесконечный цикл записи в data[1].


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 25, 2013, 22:05
А давайте  посмотрим на код и... По коду выходит, если вы открываете файл, то делаете return. А если не открываете - пытаетесь считать :D

PS восклицательный знак забыли :D
Так то оно так, Восклицательный знак там был раньше. И срабатывал return.
Системные права разрешают все и всем.
Странно...


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 25, 2013, 22:07
зачем открывать файл дважды? Индексация массива начинается с 0, а не с 1. Индекс d нигде не увеличивается, то есть идёт бесконечный цикл записи в data[1].
К сожалению это не суть проблемы. Это просто заглушка.


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 25, 2013, 22:33
Код:
QString dbg;
    dbg=currentDir.currentPath() + "/" + ui->comboFile->currentText();
    qDebug() << dbg;
    QFile target(dbg);
   target.open(QFile::ReadOnly);
        QByteArray array(target.read(20));
        char data[25];
     int d=0;
     while (d<10)
     {
         qDebug()<< array.size();
         data[d] = array.at(d);
         qDebug() << data[d];
         d++;
     }
Результат нулевой. Я немного шоке. Файл не открывается.
Текстовые файлы из той же директории открываются на ура....


Название: Re: Побайтовое чтение файла
Отправлено: Bepec от Сентябрь 25, 2013, 22:50
Стоит сделать.
1) вывести в дебаг полный получившийся путь к файлу.
2) ввести проверку на существование файла и вывести в дебаг.
3) вернуть на место проверку на открытие файла и ... вывести в дебаг.
4) если файл открыт - вывести размер файла.
5) если не открыт - вывести errorString в дебаг и увидеть таки ошибку.
6) если всё открыто и размер кошерный - попытаться прочитать всё в массив и сразу проверить размер. И... вывести в дебаг.
7) если массив есть, а размера нет - брать бубен и стучать до посинения данного бага.


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 25, 2013, 23:05
4) если файл открыт - вывести размер файла.

Собака была зарыта здесь.
Размер =0
Так со всеми бинарниками!!! В чем загвоздка?
QFile вроде как должен открывать.......


Название: Re: Побайтовое чтение файла
Отправлено: kambala от Сентябрь 25, 2013, 23:20
target.open(QFile::ReadOnly) хоть true возвращает?


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 25, 2013, 23:34
Код:
if (!target.open(QIODevice::ReadOnly));
   qDebug()<< "not open";
выполняется.
И без восклицательного знака тоже выполняется....


Название: Re: Побайтовое чтение файла
Отправлено: kambala от Сентябрь 25, 2013, 23:38
; не надо в строке с ифом ставить — это означает, что тело условия пустое


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 25, 2013, 23:42
Код:
bool b=0;
   b=target.open(QIODevice::ReadOnly);
   qDebug()<<b;

да. истина есть.
извините соврал. false


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 26, 2013, 10:19
Нашел ошибку.
Код:
void MainWindow::OpenDi()
{
    ui->textEdit->clear();
    ui->comboFile->clear();
    QFileDialog di;
    QString str = di.getExistingDirectory(0,"dialog","");
    qDebug()<< str;
    currentDir.setPath(str);
    QFileInfoList list = currentDir.entryInfoList();
    di.show();
    for (int i = 0; i < list.size(); ++i)
    {
        QFileInfo fileInfo = list.at(i);
        ui->textEdit->append(fileInfo.fileName());
    }
    ui->comboFile->addItems(currentDir.entryList());
}

currentDir - это private член класса. В теле указанного слота все устанавливается так как надо, но после его завершения, currentDir становится равным директории проекта.
Подскажите пожалуйста, как сохранить изменения currentDir.
Я уверен, что проблема будет решена.
Заранее спасибо.


Название: Re: Побайтовое чтение файла
Отправлено: Bepec от Сентябрь 26, 2013, 10:22
То у вас файл не открывается, сейчас уже приватный член класса изменяется.

У вас всё в интерфейсе сохраняется. И берите данные с интерфейса. Или же заведите переменную QString currentDir.

PS c++ не изучали?


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 26, 2013, 17:21
К сожалению не помогло...
С путями теперь все нормально. QString помог с путями.
Бинарники по прежнему не открываются.....
 
Код:
QString dbg=strCurDir + "/" + ui->comboFile->currentText();  // В dbg полный путь с именем файла. 
    qDebug() << dbg;                                               // Вывод -  "/home/exp/67563.61339.dat"
    QFile target(dbg);
    bool b=0;
   b=target.open(QIODevice::ReadOnly);
   qDebug()<<b;                                                      // Вывод - false
   qDebug()<< target.size();                                       // Вывод - 0
Теперь уже ума не приложу что ему надо.
Любой текстовый файл из /etc открывается.

В смысле "С интерфейса"?


Название: Re: Побайтовое чтение файла
Отправлено: Bepec от Сентябрь 26, 2013, 17:47
А давайте вы прочитаете моё сообщение - которое выше, с пунктами. И постепенно, не торопясь, напишите код, который им всем удовлетворяет.


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 26, 2013, 20:42
Код:
QString dbg=strCurDir + "/" + ui->comboFile->currentText();
    qDebug() << dbg;                                         //вывод -  "/home/exp/67563.68309.dat"
    bool stat=0;
    QFile target(dbg);
    stat=target.exists();
    qDebug()<<stat;                                           // вывод - false
   stat=target.open(QIODevice::ReadOnly);        
   qDebug()<<stat;                                              // вывод - false
   qDebug()<< target.size();                               // вывод - 0
То есть файл есть, но его почему то его не существует.....
С текстовым файлом вывод такой:
Код:
"/etc/cowpoke.conf" 
true
true
4169
На суд.


Название: Re: Побайтовое чтение файла
Отправлено: Bepec от Сентябрь 26, 2013, 21:00
Я не знаток linux. Но попробуйте перенести бинарный файл в ту же папку и переименовать его как текстовый файл. Не меняя ничего в программе. И посмотреть вывод.

PS я думаю что у вас что-то с правами.


Название: Re: Побайтовое чтение файла
Отправлено: skytrain от Сентябрь 26, 2013, 21:11
Действительно права. >:(
"/home/exp/67563.61339.dat"
true
true
787270
Не копируйте с винды папки без смены прав.
позор мне.....
Спасибо