Название: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: 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 реализуется применяемый в fstream?
Название: Re: Поэлементное считывание данных различных типов из двоичного файла
Отправлено: Old от Январь 25, 2013, 22:25
xokc, спасибо за ответ, но не совсем понятно, как в QFile реализуется применяемый в 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;
|