short sdata;
double ABSVOLT = 1; //вес младшего разряда АЦП в вольтах
double GAIN = 1; //усиление
double SENSE = 1; //чувствительность датчика
double AMPL = 1; //предусиление
double DC = 0; //постоянная составляющая
int format = 0;
const int size = 100;
char buf[size]= {0};
//определяем формат файла
infile = fopen("c:\\1.anp", "r"); // Открываем заголовочный файл для чтения
if (infile)
{
static const char* format_field = "FORMAT";
static const int format_len = strlen(format_field);
static const char* fields[] = {"ABSVOLT", "GAIN", "SENSE", "AMPL", "DC"}; //названия полей
static const int length = sizeof(fields)/sizeof(fields[0]); //длина служебных массивов
//длины названий полей
static const int lengths[length] = {strlen(fields[0]), strlen(fields[1]), strlen(fields[2]), strlen(fields[3]), strlen(fields[4])};
double * pVals[length] = {&ABSVOLT, &GAIN, &SENSE, &L, &DC}; //адреса переменных соответствующих полям
//ищем строку FORMAT
//а также параметры преобразований
while (!feof(infile) && fgets(buf, size, infile))
{
if (0 == strncmp(format_field, buf, format_len))
{//определяем формат
char* p = buf+format_len;
while(isspace(*p))
++p;
if ('f'==*p)
format=1; //float
else if ('i'==*p)
{
if ('2'==p[1])
format = 2; //int
else
format = 3; //short
}
continue;
}
for (int i = 0; i < length; ++i)
{//ищем другие параметры
if (0 == strncmp(fields[i], buf, lengths[i]))
{
sscanf(buf+lengths[i], "%f", pVals[i]);
break;
}
}
}
//проверяем 0 в знаменателе преобразования
if (0 == GAIN)
GAIN = 1;
if (0 == SENSE)
SENSE = 1;
if (0 == AMPL)
AMPL = 1;
fclose(infile);
}
double multiplier = ABSVOLT/GAIN/SENSE/AMPL; //вычисляем коэффициент
infile = fopen("c:\\1.ana", "rb"); // Открываем двоичный файл для чтения
outfile = fopen("c:\\1.dat", "wt"); // Открываем текстовый файл для записи
if ((NULL != infile) && (NULL != outfile)) // Если файлы открылись без ошибок...
{
while (!feof(infile)) // Пока не конец файла...
{
switch(format)
{
case 1:
fread(&fdata, sizeof(fdata), 1, infile); // Читаем данные из двоичного файла как float
fprintf(outfile, "%f\n", fdata+DC); // и записываем их в текстовый
break;
case 2:
fread(&idata, sizeof(idata), 1, infile); // Читаем данные из двоичного файла как целое
fprintf(outfile, "%d\n", idata*multiplier+DC); // и записываем их в текстовый
break;
case 3:
fread(&sdata, sizeof(sdata), 1, infile); // Читаем данные из двоичного файла как целое
fprintf(outfile, "%d\n", sdata*multiplier+DC); // и записываем их в текстовый
break;
}
}
fclose(infile); // Закрываем двоичный файл
fclose(outfile); // Закрываем текстовый файл
}