Russian Qt Forum

Qt => Общие вопросы => Тема начата: Cugop от Январь 25, 2013, 04:27



Название: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: Cugop от Январь 25, 2013, 04:27
Здравствуйте.
Задача.
Существует двоичный файл, в котором находятся элементы в следящем порядке:
- фиксированное количество элементов типа unsigned short - атрибуты,  для упрощения пусть будет пять элементов,
- за ними следуют данные типа short, количество которых указывается в пятом элементе атрибутов.
Код:
// структура двоичного файла
// атрибуты
// unsigned short - Day (день)
// unsigned short - Month (месяц)
// unsigned short - Year (год)
// unsigned short - Hour (часы)
// unsigned short - Number (количество элементов)
// данные
// short - | 1 | 2 | 3| ... | Number
Необходимо считать элементы данных в динамический массив.

На стандартном С++ я реализовал решение этой задачи следующим образом:
Код
C++ (Qt)
char  NameFile[] = "test.dat";
 
unsigned short Day(0);
unsigned short Month(0);
unsigned short Year(0);
unsigned short Hour(0);
unsigned short Number(0);
 
short Buff_Data(0);
short *Data_ array;
 
fstream FileOut;
FileOut.open(NameFile, ios_base::in | ios_base::binary);
if (!FileOut.is_open())
{
          cerr << "Error open file: " << NameFile << "\n";
          exit(0);
}
FileOut.read((char *) &Day, sizeof Day);
FileOut.read((char *) &Month, sizeof Month);
FileOut.read((char *) &Year, sizeof Year);
FileOut.read((char *) &Hour, sizeof Hour);
FileOut.read((char *) &Number, sizeof Number);
 
Data_ array = new short [Number];
for(int i=0;i< Number; i++) Data_ array[i]=0;
 
int i(0);
while (FileOut.read((char *) &Buff_Data, sizeof Buff_Data))
{
Data_ array[i] = Buff_Data;
i++;
}
FileOut.close();
FileOut.clear();
 
// --------------------
// ...
// --------------------
 
delete [] Data_ array;
 

Вопрос: подскажите, пожалуйста, как считать поэлементно данные из указанного бинарного файла средствами Qt?




Название: Re: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: kambala от Январь 25, 2013, 05:23
QDataStream


Название: Re: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: xokc от Январь 25, 2013, 13:04
QFile вместо fstream с теми же (почти добуквенно) методами.


Название: Re: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: Cugop от Январь 25, 2013, 22:15
kambala, спасибо.  Я в документацию смотрел и в упор не видел.

Ответ на свою задачу:
Код
C++ (Qt)
quint16 Day(0);
quint16 Month(0);
quint16 Year(0);
quint16 Hour(0);
quint16 Number(0);
 
short Buff_Data(0);
short *Data_array;
 
QString FileName="test.dat";
QFile readFile(FileName);
readFile.open(QFile::ReadOnly);
 
QDataStream outFile(&readFile);
outFile.setByteOrder(QDataStream::LittleEndian);
outFile.setVersion(QDataStream::Qt_4_8);
 
outFile>>Day;
outFile>>Month;
outFile>>Year;
outFile>>Hour;
outFile>>Number;
 
Data_array = new short [Number];
for(int i=0;i < Number; i++) Data_ array[i]=0;
 
int i(0);
while (i < Number)
{
   outFile>>Buff_Data;
   Data_array[i] = Buff_Data;
   i++;
}
readFile.close();
 
// --------------------
// ...
// --------------------
 
delete [] Data_array;
 


Название: Re: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: Cugop от Январь 25, 2013, 22:20
xokc, спасибо за ответ, но не совсем понятно, как в QFile реализуется
Код:
ios_base::binary
применяемый в fstream?


Название: Re: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: Old от Январь 25, 2013, 22:25
xokc, спасибо за ответ, но не совсем понятно, как в QFile реализуется
Код:
ios_base::binary
применяемый в fstream?
А он по умолчанию открывается как бинарный, если не указывать при открытии QIODevice::Text


Название: Re: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: Cugop от Январь 26, 2013, 21:16
Old, спасибо.

Второй ответ под старый код:
Код
C++ (Qt)
QString FileName="test.dat";
 
unsigned short Day(0);
unsigned short Month(0);
unsigned short Year(0);
unsigned short Hour(0);
unsigned short Number(0);
 
short Buff_Data(0);
short *Data_ array;
 
QFile FileOut(FileName);
FileOut.open(QFile::ReadOnly);
 
FileOut.read((char *) &Day, sizeof Day);
FileOut.read((char *) &Month, sizeof Month);
FileOut.read((char *) &Year, sizeof Year);
FileOut.read((char *) &Hour, sizeof Hour);
FileOut.read((char *) &Number, sizeof Number);
 
Data_ array = new short [Number];
for(int i=0;i< Number; i++) Data_ array[i]=0;
 
for(int i=0;i< Number; i++)
{
          FileOut.read((char *) &Buff_Data, sizeof Buff_Data);
          Data_ array[i] = Buff_Data;
}
FileOut.close();
 
// --------------------
// ...
// --------------------
 
delete [] Data_ array;