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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поэлементное считывание данных различных типов из двоичного файла  (Прочитано 7447 раз)
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?


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

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Январь 25, 2013, 05:23 »

QDataStream
Записан

Изучением 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
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Январь 25, 2013, 13:04 »

QFile вместо fstream с теми же (почти добуквенно) методами.
Записан
Cugop
Гость
« Ответ #3 : Январь 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;
 
Записан
Cugop
Гость
« Ответ #4 : Январь 25, 2013, 22:20 »

xokc, спасибо за ответ, но не совсем понятно, как в QFile реализуется
Код:
ios_base::binary
применяемый в fstream?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Январь 25, 2013, 22:25 »

xokc, спасибо за ответ, но не совсем понятно, как в QFile реализуется
Код:
ios_base::binary
применяемый в fstream?
А он по умолчанию открывается как бинарный, если не указывать при открытии QIODevice::Text
Записан
Cugop
Гость
« Ответ #6 : Январь 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;
 
« Последнее редактирование: Январь 27, 2013, 08:05 от Cugop » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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