Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Декабрь 11, 2012, 18:10



Название: Чтение с файла
Отправлено: demaker от Декабрь 11, 2012, 18:10
Здравствуйте.

У меня есть файл данных. Файл сохранен как бинарный.
Мне нужно с него считать данные и сохранить в надлежащем виде.

хочу считать по байтно  
Код:
char DynamicData;
QDataStream in(pFile);
in.setVersion(QDataStream::Qt_4_7);
in >> DynamicData;
pFile->close();

Но выдает ошибку.
Подскажите почему?




Название: Re: Чтение с файла
Отправлено: Mikhail от Декабрь 11, 2012, 18:21
Хотелось бы увидеть какую оибку выдает.
Фйл то открываешь, или как?


Название: Re: Чтение с файла
Отправлено: Alex Custov от Декабрь 11, 2012, 18:24
Но выдает ошибку.
Подскажите почему?

Видимо потому, что написан неправильный код


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 11:10
Ошибка
comtrade.cpp:112: error: no match for 'operator>>' in 'in >> ((CCOMTRADE*)this)->CCOMTRADE::DynamicData'


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 11:16
Но выдает ошибку.

Ошибки нет. Просто ничего не выводит в qDebug(). ???

Определись уже, есть ошибка или нет.

А что он должен вывести в дебаг? У тебя в коде никакого вывода нет, вот и не выводит ничего


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 11:17
Ошибка
comtrade.cpp:112: error: no match for 'operator>>' in 'in >> ((CCOMTRADE*)this)->CCOMTRADE::DynamicData'

Что у тебя на этой 112й строке?


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 11:21
Код:
 in >>  DynamicData;


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 11:23
По тексту ошибки создается впечатление, что DynamicData это не просто char. Приведи больше кода


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 11:28

Код:
class CCOMTRADE
{
public:
  CCOMTRADE ();
  bool LoadConfig (QString FileName);
  bool LoadData (QString FileName);
  bool LoadFile(QString filename);
  bool LoadFileBinary(QString filename);

  unsigned short int GetEntrySize (COMTRADE *cfg);
  void Init ();
  double * getDataVector(int channel);

public:
  COMTRADE *DynamicCfg;
  QStringList*Buffer;
  double **AnalogData;
  int **DigitalData;
 
/*!!!!!!!!!!!!!*/ char DynamicData;

  double *TimeVector;

};







Код:
    QFile*pFile = new QFile;; //File * pFile;
    QDir::setCurrent("C:/tmp");
    pFile->setFileName(filename);

    if(pFile->exists())
    {
        if(!pFile->open(QIODevice::ReadOnly | QIODevice::Text))
        {
            qDebug()<<"file not open";
            delete Buffer;
            delete pFile;
            return false;
        }

        //DynamicData = new char[size];
        QDataStream in(pFile);
        in.setVersion(QDataStream::Qt_4_7);
        in >> DynamicData;
        qDebug()<<"BinaryData = "<<DynamicData;
        pFile->close();
        delete pFile;
        return true;
    }
    else
    {
        qDebug()<<"file not exists Load File";
        delete Buffer;
        delete pFile;
        return false;
    }


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 11:35
Хочу в массив типа char запихнуть файл :)
А он символ считать не может ???


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 11:37
В QDataStream нету метода для чтения в char, но есть для чтения в char*

Цитировать
QDataStream & QDataStream::operator>> ( char *& s )
Reads the '\0'-terminated string s from the stream and returns a reference to the stream.
Space for the string is allocated using new -- the caller must destroy it with delete[].


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 11:41
поменял в .h

Код:
char *DynamicData;
в .cpp
Код:
 in >> *DynamicData;

таже ошибка


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 11:45
поменял в .h

Код:
char *DynamicData;
в .cpp
Код:
 in >> *DynamicData;

таже ошибка

Звездочку убери при чтении, со звездочкой это ничем от предыдущего не отличается


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 11:52
 :)
да, точно

поменял

Код:
 QDataStream in(pFile);
 in.setVersion(QDataStream::Qt_4_7);
 in >> DynamicData;
 qDebug()<<"BinaryData = "<<*DynamicData;

хочу в дебаге посмотреть что считалось
но ...exe завершился с кодом -1073741819


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 12:00
Звездочку убери!!


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 12:03
Да убрал ее.
Тогда он в дебаге не выдает ничего


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 12:06
А нет все норм  ::)
прошу прощения.

А если считать несколько символов то в цикл забить и запихивать в массив?


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 12:15
Что? Ты читал вообще кусок доки, который я кинул? QDataStream считывает не один символ, а строку, завершающуюся нулем


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 12:19
 :(
да тогда надо по другому делать будет
Все понял
Код:
QDataStream & QDataStream::operator>> ( char *& s )

This is an overloaded function.

Reads the '\0'-terminated string s from the stream and returns a reference to the stream.

Space for the string is allocated using new -- the caller must destroy it with delete[].
Спасибо :)


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 13:08
Подсккажите ,что здесь не правильно
qDebug() не выводит 44, а выводит 0
Код:
        QBuffer buffer;
        buffer.open(QBuffer::ReadWrite);

        QDataStream out(&buffer);
        int i = 44;
        out << i;
        out >> DynamicData;
        qDebug()<<"BinaryData = "<<DynamicData;



Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 13:12
Неправильно работаешь с потоком. После записи указатель стоит после записанного 44 и читать оттуда нечего


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 13:21
А как надо?


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 13:22
Как надо что? я смысла практического в приведенном коде ни вижу


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 13:28
Пытаюсь разобраться как правильно работать с потоками ввода и вывода.
Потому что по работе с файлом ничего не получается.
Вот и пробую на элементарном уровне понять как и что работает.




Название: Re: Чтение с файла
Отправлено: kambala от Декабрь 12, 2012, 13:42
каждая операция чтения/записи двигает «курсор» вперёд. пропустить байты можно с помощью QDataStream::skipRawData(int), установить произвольную позицию «курсора» — dataStream.device()->seek(int)


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 14:50
Ум понятно.
А скажите а вот бинарный файл запихнуть в массив  типа char вот можно:
Код:
 
 char* massive ;
 
 QDataStream in(pFile);
 massive = new char[length];
 in.setVersion(QDataStream::Qt_4_7);
 while(in.atEnd())
 {
      in.readBytes(massive+i, len);  
      i++;
  }

а то не пойму как работает readBytes.


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 14:52
Можно, разрешаю. А почему побайтно и зачем тут вообще QDataStream? Ну и пользуешься функцией readBytes ты неправильно


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 14:58
А почему побайтно и зачем тут вообще QDataStream?

Побайтно потому что бинарный файл будет.
а как без него QDataStream?


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 15:02
А вот прямо через QFile::read. И не побайтно, а много байт сразу. Этому бинарность никак не мешает


Название: Re: Чтение с файла
Отправлено: mutineer от Декабрь 12, 2012, 15:13
У базового класса она есть


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 15:14
Да у QIODevice есть точно


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 15:15
Я ЛОХ :-\


Название: Re: Чтение с файла
Отправлено: demaker от Декабрь 12, 2012, 15:23
Спасибо :)