【发布时间】:2011-02-16 16:01:45
【问题描述】:
我正在尝试从 COBOL 程序生成的 .DAT 文件中获取值。 但问题是当我尝试将数据显示到我的 c++ 程序时。 我得到一个奇怪的值,比如 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
【问题讨论】:
-
Comp-5 是一种机器相关格式。在回答之前,我想在您的问题中查看完整记录的十六进制转储。
-
只需写下一条记录的十六进制转储。没有这个,任何人都无法正确回答
-
您似乎期待数字的文本格式。 COBOL 确实使用了这些(或者在我使用它时确实使用过),但也使用了其他几种格式。 COMP-5 似乎是标准的二进制数据,因此请尝试将其读取为常规的四字节整数。请记住,小数点通常是隐含的,在编译器保留小数点的情况下,15.25 可能是 1525。
-
你知道第一张唱片应该产生什么吗?它看起来像 ASCII 它是“014857B?2/42 10 ???????1000”在哪里?超出标准的 96 个 ASCII 可打印字符。没有 1525 的迹象。这确实表明它使用的是文本格式,但您没有正确找到数字的结尾。
-
@RyanA 请张贴COBOL程序的FD记录。文件中的数据不是您所描述的,但可能是有效的 ASCII 和另一种 FD 格式的二进制数据。