Ну задачка в принципе уже решена, но это сделано с помощью WinApi функций, таких как
::ReadFile()
А теперь хочу решить ее с помощью QDataStream. Подскажите, пожалуйста, как правильно скачать в свои структуры из файла! Подскажите, пожалуйста, как это в коде сделать?
Мои предположения: эту иою структуру (обзовем ее T) занести в QVector и потом сделать: QVector<T*> vecT;
QDataStream in(file);
in >> vecT;
тогда уж так:
QVector< T > vectT;
QDataStream in(file);
in << vectT;
Помогите пожалуйста, я немного запутался.
Вот структура, которую я пытаюсь считать из файла
struct MAC4Header
{
enum {
SIGN_SIZE = 16,
LIB_IDENT_SIZE = 256 - SIGN_SIZE - 2 * sizeof(int) };
enum {
CUR_VERSION_MAJOR = 1,
CUR_VERSION_MINOR = 0,
};
char Signature[ SIGN_SIZE ];
char LibraryIdent[ LIB_IDENT_SIZE ];
int VersionMajor;
int VersionMinor;
float Latb;
float Late;
float Lonb;
float Lone;
unsigned int Year;
unsigned int Month;
unsigned int Day;
unsigned int Hour;
unsigned int Min;
unsigned int Sec;
unsigned int Milliseconds;
unsigned long Crc32;
unsigned int ChartNumber;
unsigned int SumSize;
};
QDataStream& operator>>(QDataStream& in, MAC4Header& lib_head)
{
QString libIdent;
int _crc = 0;
in >> libIdent;
string libIdentificator = libIdent.toStdString();
strcpy(lib_head.LibraryIdent, libIdentificator.c_str());
in >> lib_head.VersionMajor >> lib_head.VersionMinor >> lib_head.Latb >> lib_head.Late >> lib_head.Lonb;
in >> lib_head.Lone >> lib_head.Year >> lib_head.Month >> lib_head.Day >> lib_head.Hour >> lib_head.Min;
in >> lib_head.Sec >> lib_head.Milliseconds >> lib_head.ChartNumber >> lib_head.SumSize >> _crc;
lib_head.Crc32 = _crc;
return in;
}
bool LibReader::TRead()
{
bool ret = false;
if(!open()) return ret;
QDataStream in(file);
int v = in.version();
QVector<MAC4Header> libVec(1, MAC4Header());
int size = libVec.size();
in >> libVec;
//libHeader = vecLib.front();
/*QVector<MAC4Header*> libHeader(1);
QVector<MAC4ChartHeader*> chartHeader;
in >> libHeader;*/
shutdown();
return ret;
}
/// Класс для чтения библиотек карт
class LibReader
{
private:
QFile* file; ///< файл для чтения библиотек карт
public:
LibReader(const QString fileName): file(new QFile(fileName)) {}
~LibReader() { delete file; }
bool open() { if(isOpen()) shutdown(); file -> open(QIODevice::ReadOnly); return isOpen(); }
bool isOpen() { return file -> isOpen(); }
void setFilename(const QString fileName) { if(isOpen()) shutdown(); file -> setFileName(fileName); }
void shutdown() { file -> close(); }
bool exists() const { return file -> exists(); }
bool TRead();
bool loadCharts();
};
Кто знает правильное решение, поскажите, пожалуйста?
А как ты записываешь вектор в файл?
struct _str
{
int y;
QString s;
double n;
_str(): y(100), s("Hello, Kelly!"), n(0.9652) {}
};
QDataStream& operator>>(QDataStream& in, _str& ls);
QDataStream& operator<<(QDataStream& out, const _str& ls);
QDataStream& operator>>(QDataStream& in, _str& ls)
{
in >> ls.y >> ls.s >> ls.n;
return in;
}
QDataStream& operator<<(QDataStream& out, const _str& ls)
{
out << ls.y << ls.s << ls.n;
return out;
}
QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
_str un;
QDataStream out(&fl);
out << un;
fl.close();
un.s = "YYY";
un.n = -0.18;
un.y = 1;
QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl);
in >> un;
fl.close();
_str un;
QVector<_str> unv;
unv.push_back(un);
QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
QDataStream out(&fl);
out << unv;
fl.close();
unv[0].y = 1;
unv[0].s = "Hi";
unv[0].n = 1.3;
QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl);
in >> unv;
fl.close();
Возможно баг.
Я вообще не могу найти реализации чтения QVector.
QDataStream in(&fl);
QDataStream in(&fl1);
Копи-пасте вредно для здоровья!
Попробуй так:
QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
_str un;
QDataStream out(&fl);
out << un;
fl.close();
un.s = "YYY";
un.n = -0.18;
un.y = 1;
QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl1);
in >> un;
fl1.close();
QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
_str un;
QDataStream out(&fl);
out << un;
fl.close();
un.s = "YYY";
un.n = -0.18;
un.y = 1;
QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl1);
in >> un;
fl1.close();
Приведи оператор operator<<.
а кто пишет эту структуру?
как я понял не ты, правильно?
если ты читаешь настоящий nt.dat, то QDataStream тебе не подойдет для чтения, прийдется читать с помощью read и write.
что в принципе удобней.
А как ты читаешь на MFC?
read и write работаю на подобии ReadFile и WriteFile.
Вот так:
_str strIn;
QFile f1("nt.dat");
f1.open(QIODevice::WriteOnly);
f1.write( (const char *)&strIn, sizeof( strIn));
f1.close();
_str strOut;
strOut.n = .0123;
strOut.s = "test";
strOut.y = 1;
QFile f2("nt.dat");
f2.open(QIODevice::ReadOnly);
f2.read( (char *)&strOut, sizeof( strOut));
f2.close();
может проще для таких структур данных использовать XML? тем более в Qt есть и SAX-парсеры, и DOM-парсеры...
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)