@kytcenochka

С ++. Создание и запись бинарного файла?

Задача состоит в том, чтобы создать файл и записать его данными, но есть структура параметров, которая должна соблюдаться:
n -индекс (4 байта)
timestamp - временная метка (4 байта)
unsigned int Ak - значение напряжения аналогового канала (2 байта)
unsigned int SM -значение напряжения дискретного канала (2 байта)
Каналов может быть много, как будут поступать данные пока неизвестно.
Допустим 3 аналоговых канала 2 дискретных
Файл должен записываться
n timestamp анал. каналы дискр.
4 байта 4 байта 2 байта 2 байта 2 байта 2 байта 2 байта

Я новичок в с++. Подскажите, возможно, есть более разумный вариант заполнения данных каналов(чтоб не с консоли).
Да и вообще, мои ошибки. И как проверить соблюдается ли структура.

Binary.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream> 
#include <fstream> 

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{

    // Create Binary file
    struct Binaryfile{
        int n; //4 byte
        int timestamp;//4 byte
        unsigned int Ak;//2 byte
        unsigned int SM;//2 byte
    };
        Binaryfile s1,analog,discret;
        s1.n =3;
        s1.timestamp=45;
        int countAnalCh=2;
        int countDiscrCh=3;
        analog.Ak=0;
        discret.SM=0;

        fstream binary_file("D:\\Struct\\Struct\\ComtradeFormat\\fileConfiguration.dat",ios::out|ios::binary|ios::app);
        if(!binary_file)
        {
            cout << "Cannot open file.\n";
            return 1;
        }
        binary_file.write((char*)(&s1),sizeof(s1));//write number sample and timestamp

        for (int i=0; i<countAnalCh;i++)
        {
            cout <<"Value analog channel: ";
            cin >> analog.Ak;
            binary_file.write((char*)(&analog.Ak),sizeof(analog.Ak));

        }
        for (int j=0; j<countDiscrCh;j++)
        {
            cout <<"Value discret channel: ";
            cin >> discret.SM;
            binary_file.write((char*)(&discret.SM),sizeof(discret.SM));

        }
        
        binary_file.close();

  
	return 0;
}
  • Вопрос задан
  • 2520 просмотров
Пригласить эксперта
Ответы на вопрос 3
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Для типов, где важен размер желательно использовать fixed width типы.
Заполнять можно из текстового файла собственного формата или одного из стандартных: ini, json, yaml. Во втором случае стоит воспользоваться готовой библиотекой для чтения файлов соответствующего формата.
Так же можно написть GUI, но это отдельная история.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
1. unsigned int на большинстве платформ - 4 байта, поэтому используйте более подходящие типы для сигналов: uint16_t например.
2. Раз количество каналов меняется, то есть смысл отделить заголовок (n и timestamp) от собственно данных каналов. Заголовок пишете отдельно, а данные каналов храните в массивах соответствующих типов и записываете целиком массив.
3.Т.к. у вас не известно заранее количество каналов, то стоит писать в файл эту информацию (включить количество аналоговых и дискретных каналов в заголовок). 4.Так же есть смысл ввести в заголовок некую преамбулу (набор из 2-5 символов идентифицирующих ваш тип файла) и версию файла. Это поможет при последующих модификациях структуры файла.
5.Удобно проверять получившийся файл с помощью HEX редактора 010 Editor - там можно на бинарный файл накладывать структуру и просматривать уже структурированный файл. Структуры описываются в Си подобном стиле, так что научится можно за 20 минут на готовых примерах.
Ответ написан
Комментировать
@kytcenochka Автор вопроса
Создаю массив, чтобы заполнить значения аналоговых каналов. Ошибка в этой строке
unsigned short analogValue[ChanellCount.analogChanell];ожидается константа, но в структуре не могу сделать константу.
Важно, чтобы размерность массива была равна количество аналоговых каналов.
Подскажите решение!

struct InfaboutChanell
    { 
       int chanellcount;
       int analogChanell;
       int discretChanell;
    };
    InfaboutChanell ChanellCount;
    ChanellCount.chanellcount=5;
    ChanellCount.analogChanell=2;// количество аналоговых каналов
    ChanellCount.discretChanell=3;

unsigned short analogValue[ChanellCount.analogChanell];
    for(int i=0; i<ChanellCount.analogChanell; i++)
        analogValue[i] = 0+rand()%200;
    binary_file.write((char *) &analogValue, sizeof analogValue);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы