Преобразование данных из файла .DAT, сгенерированного из COBOL - PullRequest
0 голосов
/ 16 февраля 2011

Я пытаюсь получить значение из файла .DAT, сгенерированного программой COBOL.Но проблема в том, когда я пытаюсь отобразить данные в моей программе на С ++.Я получаю странное значение, как для 15,25, я получаю 960000.

Мой вопрос: какой тип данных предпочитается импортировать

PIC  S9999V99  COMP-5  VALUE +0

and

PIC  S9(7)     COMP-5  VALUE +0

Мой код C ++ для импорта байтов в long

BOOL Import( LONG &nVal, INT nNumChars, FILE *pFile )
{
   char strVal[10];

   for ( int n = 0; n < (nNumChars); n++ )
   {
      if ( fread( &strVal[n], 1, 1, pFile ) != 1 )
      {
         return FALSE;
      }
   }

   strVal[n] = NULL;

   nVal = atol(strVal);

   return TRUE;
}

Шестнадцатеричная первая запись

30 31 34 38 35 37 42 E7    03 00 00 00 00 00 00 31
32 2F 34 32 20 20 31 30    30 30 30 20 20 20 20 20
20 20 20 20 20 20 20 20

Ответы [ 4 ]

2 голосов
/ 17 февраля 2011

Запись, которую вы пытаетесь прочитать:

  0  1  4  8  5  7  B --    -- -- --  z e r o e s 1    2  / 4  2   b  b  1  0

 30 31 34 38 35 37 42 E7    03 00 00 00 00 00 00 31   32 2F 34 32 20 20 31 30 
 ///////////////////////////////////////////////////////////////////////////////    
  0  0  0  b  b  b  b  b     b  b  b  b  b  b  b  b  

 30 30 30 20 20 20 20 20    20 20 20 20 20 20 20 20 

Где

b means whitespace  

zeroes are binary zeros

-- is a BINARY NUMBER COMP-5 and reversed (000003E7) == 999

Итак, никаких следов вашего 1525 года нет, но, возможно, это поможет вам определить содержание. Посмотрите на это "999"!

НТН!

0 голосов
/ 17 февраля 2011

Как ранее заявляли авторы, требуется больше информации; а именно какой Cobol Compiler ; и Cobol Copybook (или его часть) будет полезен.

Но считывать массив символов и использовать atol, вероятно, неправильно.

Для большинства компиляторов Cobol (RM Cobol отличается) вы должны

  • Читать как байтовый массив
  • Рассчитать из байтового массива. Для 2-байтового положительного числа вы можете

    long val = byte_array [0] * 256 + byte_array [1] / * Big Ending * / long val = byte_array [0] + byte_array [1] * 256 / * маленький конец * /

Примечание: * 256 должно быть сдвигом 8 бит, но я не вспоминаю операторы сдвига C


Буква V на Рис. 99V99 является предполагаемым десятичным знаком, т.е. Вам нужно будет добавить следующий код к коду

 double ret_val = long_val / 10      /* if  pic p(?)V9 */
 double ret_val = long_val / 100     /* if  pic p(?)V99 */
 double ret_val = long_val / 1000    /* if  pic p(?)V999 */
 double ret_val = long_val / 10000   /* if  pic p(?)V9990 */

чтобы получить реальную стоимость.

Примечание: Некоторые редакторы могут отображать файлы данных Cobol с помощью Cobol. Тетрадь (хотя и зависит от версии Cobol).

0 голосов
/ 17 февраля 2011

PIC S9(7) COMP-5 VALUE +0

COMP-5 означает, что значение сохраняется в двоичном виде. (Вам может понадобиться поменять местами байты, в зависимости от платформы.) S означает, что поле подписано (возможно, два дополнения). 9(7) означает, что в поле должно быть место для значений до & plusmn; 9999999, для чего требуется 4 байта (1 знаковый бит + 24 бит значения + 7 битов заполнения). Таким образом, эквивалентный тип данных C - int32_t.

PIC S9999V99 COMP-5 VALUE +0

V - неявное десятичное место. Все, что вставляет в него программа COBOL, масштабируется на 100 за кадром (например, 15,25 сохраняется как 001525, 16 сохраняется как 001600 и т. Д.). В C ++ вам придется делать это самостоятельно.

Я бы обычно использовал double для внешнего типа данных, но два десятичных знака настоятельно предлагают доллары и центы, для которых вы должны использовать десятичный тип, если таковой имеется.

30 31 34 38 35 37 42 E7    03 00 00 00 00 00 00 31
32 2F 34 32 20 20 31 30    30 30 30 20 20 20 20 20
20 20 20 20 20 20 20 20

Это похоже на строку ASCII 014857B�␃␀␀␀␀␀␀12/42 10000, которая будет предлагать DISPLAY вместо COMP-5 чисел. Вы уверены, что смотрите на правую часть записи?

0 голосов
/ 16 февраля 2011

В вашем вопросе недостаточно информации, чтобы ответить на него.

Нужно посмотреть на программу, сгенерировавшую файл данных, и скопировать туда структуры.

...