crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Потоковое чтение и запись структуры (бинарный файл)
eugrita
  опции профиля:
сообщение 19.6.2014, 23:31
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 19.6.2014
Пользователь №: 4172

Спасибо сказали: 0 раз(а)




Репутация:   0  


Работаю на QT 4.2 Не получается
Есть структура
struct TComp {
    char Marka[15];
    char Pr[20];
  qint8 Vop;//объем ОП
  qint8 Vgd;//объем ЖД
  qint8 Price; //цена
  TComp *next;
            };

Надо несколько таких записей записать в бинарный файл, потом считать в ОП. Данная структура содержит текстовые поля фиксированной длины
Пытаюсь делать переопределением операторов потокового вывода и ввода
для записи так
QDataStream& operator <<(QDataStream &st, const TComp &a)
{  st.writeBytes(a.Marka,15);st.writeBytes(a.Pr,20);
     st << a.Vop; st << a.Vgd; st << a.Price;};

компилятор не находит ошибок, файл создается, что-то туда пишется
А для чтения пытаюсь так
QDataStream& operator >>(QDataStream &st,  TComp &a)
{
    st.readBytes(a.Marka,15);st.readBytes(a.Pr,20);
    //st.readRawData(a.Marka,n1); st.readRawData(a.Pr,n2)
    st >> a.Vop; st >> a.Vgd; st >> a.Price};
}

или так (не очень представляю смысл 2-го параметра в readBytes)
 int n1=1000,n2=1000;
    st.readBytes(a.Marka,n1);st.readBytes(a.Pr,n2);
    //st.readRawData(a.Marka,n1); st.readRawData(a.Pr,n2)
    st >> a.Vop; st >> a.Vgd; st >> a.Price};

компилятор выдает:
invalid conversion from char * to char *
error initializing argument 1 of ...
Обращаю внимание мне уже сделали замечание, что сигнатура оператора readBytes
QDataStream & QDataStream::readBytes ( char *& s, uint & l ) поэтому
2-е переопределение имеет параметры
Цитата
QDataStream& operator >>(QDataStream &st, TComp &a)

а не
QDataStream& operator >>(QDataStream &st,  const TComp &a)

но это не помогло (хотя при чтении компилятор проглотил с const)
2)почему-то у меня компилятор не понимает синтаксис a.array как написано здесь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.6.2014, 7:11
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


типы char* и char[] в С и С++ - это разные типы. иногда компилятор их не приводит друг к другу.
хотя обычно компилятор на это ругается только при передаче параметра в функцию, а приведение к указателю он вроде должен и так сожрать.

короче говоря, лучше сделать так:
char *ptr = a.Pr; 
readBytes(ptr, 20);


P.S. и это вопрос не по Qt, а по C++

Сообщение отредактировал Iron Bug - 20.6.2014, 8:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.6.2014, 8:57
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


на самом деле, если бы это был С++11 совместимый компилятор и там бы стояла такая конструкция:
QDataStream & QDataStream::readBytes ( char *&& s, uint & l ) поэтому

то есть rvalue reference вместо lvalue reference, то тогда бы компилятор сожрал это без всяких преобразований.
я не знаю, компилится ли Qt под стандарт С++11 и используются ли там rvalue reference параметры.

Сообщение отредактировал Iron Bug - 20.6.2014, 8:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 6:03