Russian Qt Forum
Ноябрь 23, 2024, 23:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Побайтовое чтение файла  (Прочитано 12582 раз)
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];
     }
     }
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 25, 2013, 21:59 »

А давайте  посмотрим на код и... По коду выходит, если вы открываете файл, то делаете return. А если не открываете - пытаетесь считать Веселый

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

Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Сентябрь 25, 2013, 22:00 »

зачем открывать файл дважды? Индексация массива начинается с 0, а не с 1. Индекс d нигде не увеличивается, то есть идёт бесконечный цикл записи в data[1].
Записан
skytrain
Гость
« Ответ #3 : Сентябрь 25, 2013, 22:05 »

А давайте  посмотрим на код и... По коду выходит, если вы открываете файл, то делаете return. А если не открываете - пытаетесь считать Веселый

PS восклицательный знак забыли Веселый
Так то оно так, Восклицательный знак там был раньше. И срабатывал return.
Системные права разрешают все и всем.
Странно...
Записан
skytrain
Гость
« Ответ #4 : Сентябрь 25, 2013, 22:07 »

зачем открывать файл дважды? Индексация массива начинается с 0, а не с 1. Индекс d нигде не увеличивается, то есть идёт бесконечный цикл записи в data[1].
К сожалению это не суть проблемы. Это просто заглушка.
Записан
skytrain
Гость
« Ответ #5 : Сентябрь 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++;
     }
Результат нулевой. Я немного шоке. Файл не открывается.
Текстовые файлы из той же директории открываются на ура....
Записан
Bepec
Гость
« Ответ #6 : Сентябрь 25, 2013, 22:50 »

Стоит сделать.
1) вывести в дебаг полный получившийся путь к файлу.
2) ввести проверку на существование файла и вывести в дебаг.
3) вернуть на место проверку на открытие файла и ... вывести в дебаг.
4) если файл открыт - вывести размер файла.
5) если не открыт - вывести errorString в дебаг и увидеть таки ошибку.
6) если всё открыто и размер кошерный - попытаться прочитать всё в массив и сразу проверить размер. И... вывести в дебаг.
7) если массив есть, а размера нет - брать бубен и стучать до посинения данного бага.
Записан
skytrain
Гость
« Ответ #7 : Сентябрь 25, 2013, 23:05 »

4) если файл открыт - вывести размер файла.

Собака была зарыта здесь.
Размер =0
Так со всеми бинарниками!!! В чем загвоздка?
QFile вроде как должен открывать.......
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Сентябрь 25, 2013, 23:20 »

target.open(QFile::ReadOnly) хоть true возвращает?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
skytrain
Гость
« Ответ #9 : Сентябрь 25, 2013, 23:34 »

Код:
if (!target.open(QIODevice::ReadOnly));
   qDebug()<< "not open";
выполняется.
И без восклицательного знака тоже выполняется....
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Сентябрь 25, 2013, 23:38 »

; не надо в строке с ифом ставить — это означает, что тело условия пустое
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
skytrain
Гость
« Ответ #11 : Сентябрь 25, 2013, 23:42 »

Код:
bool b=0;
   b=target.open(QIODevice::ReadOnly);
   qDebug()<<b;

да. истина есть.
извините соврал. false
« Последнее редактирование: Сентябрь 26, 2013, 00:00 от skytrain » Записан
skytrain
Гость
« Ответ #12 : Сентябрь 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.
Я уверен, что проблема будет решена.
Заранее спасибо.
Записан
Bepec
Гость
« Ответ #13 : Сентябрь 26, 2013, 10:22 »

То у вас файл не открывается, сейчас уже приватный член класса изменяется.

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

PS c++ не изучали?
Записан
skytrain
Гость
« Ответ #14 : Сентябрь 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 открывается.

В смысле "С интерфейса"?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.