pascal与c++ 语言关于数据存储格式的差异(100分)

  • 主题发起人 主题发起人 myzzh
  • 开始时间 开始时间
M

myzzh

Unregistered / Unconfirmed
GUEST, unregistred user!
Pascal语言中的数据类型存储为二进制格式后,用c++程序读出时,是否会出错?
Pascal语言中那些数据存储为相当于C++语言中的Long,Short,Int,Char字串,Float,Double类型。
这些数据类型存储为二进制格式是否与C++程序存储的结果一致?
请各位高手举例(二进制和十进制对照)说明。
 
能不能把你具体的代码贴出来。我分析一下。
 
pascal 的数据可以有两种存法,一种是文本方式,一种是二进制方式,
用文本方式比较简单,
aFile: Text
(pascal 6.0 下,delphi TextFile)
Read(aFile, aType)
aType 为简单类型
你可以手工编辑文件,然后读出。
比如一个文件的内容为:c:/temp.txt
1 0 0 0

var i: integer;
begin
Assign(aFile, 'c:/temp.txt');
Reset(aFile);
Read(aFile, i);
//读出来的就为 i = 1;
end;

还有一种是 file of aType,是二进制文件,
比如 File of Integer , File of aRecord (自定义)等等。

c++ pascal
long integer long
Short word (这个可能有符号问题)
int integer
float real
double
char char
char * string
pascal 好久不搞,delphi 中又有变化,
也许有说错的地方,
 
首先感谢 lig superMMX 两位。

对此问题,我补充说明如下:
Long I=1034(十进制)在二进制文件中的存放格式是:00 00 04 0a(十六进制)
还是: 0a 04 00 00
即:C++ Builder与Delphi的等同类型的存放格式是否相同?
到底是高位在前,还是底位在前?
Short Double Float 也照此说明。
 
这是机器规定的,x86计算机整数都是低位在前高位在后
 
就数值类型而言,基本的integer、float、double等类型,
Delphi和C++有一一对应的关系,只需要注意一下就是了
可以参见SuperMMX的对照表
(我记得Delphi支持所有的C++数值类型)
但是Delphi中的string与C++中的string类型完全不同,
和以前的Pascal也大大不同了。
C++的string其实就是字符数组,Delphi中却不是的,因此不能
简单地通用。
一个简单的例子,在Delphi中使winapi时,必须将string类型的
参数转化为pchar类型,pchar类型就是和C++中的字符串完全兼容的。

所以,据我推想,在向二进制文件中写入string类型时,应将其
转化为Pchar类型,才能正确地被C++程序读出。
当然,要是文本文件,就不用考虑这个了。
但我也没有实践经验,以上意见仅供参考。
 
在二进制文件中的存储格式和在内存中的一样,高位放在高地址。
(我不理解为什么要说高位在前或低位在前),
数字都是这样,string 就是一个挨着一个顺序放的。

估计 c 读字符串是读到一个#0为止,是不是二进制没有太大关系吧。

 
String类型第一个字节是字符串长度
第二个字节是引用记数
以后是字符串的实际内容
没有结束标志
跟C不同

C读字符串是读到一个#0为止
所以最好把他转化成Pchar来存储
 
不会。
C++ Builder 与 Delphi 同类型的数据在二进制文件,内存中的
存放格式是一样的。
如:LONG I=1234H 的存放格式都是 34H,12H,00H,00H。
原因如下:
C++ Builder,Delphi,甚至VB,VC等编辑工具它们相同类型数据的
存放格式都采用相同的约定。请注意:对数据进行运算的是CPU,不是软件,
如果不同CPU如何识别。
老兄如果对数据存放格式不清楚,请参阅 计算机组成原理 的
教程。
至于Delphi的String与BCB的字符串类型本来就不同存储格式当然不
同。它和BCB中AnsiString 这个类接近。
 
基本同意SuperMMX网友的观点,但C++中的char *对应delphi中的PChar类型。
我个人观点,PChar就是Delphi中的字符串指针。
 
同意zuowei
 
缺省下Delphi的String和BCB的AnsiString不是相近,而是就是一回事。

缺省设置下Delphi的String就是AnsiString(AnsiString也是delphi下的类型)
(除非特别设置string为ShortString例外(为了与早期版本兼容))
 
对, string 本来是有 255 字符限制的,但现在可以达到 4g,
就是这个原因。
 
多人接受答案了。
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部