该read函数说明:read(Var BUF;Size:int64);
BUF代表缓冲区(始址??)SIZE为从某文件流中读取数据到缓冲区的字节数。
我有一STRING变量:S:setlength(s,20);
下为出错代码:
tfileStream.create(filename).read(s,10):编译能通过,但运行到该句后发生ACCESSViolation异常。
修改后:tfileStream.create(filename).read(pointer(s)^,10);运行正常??!!
请各位大侠不吝指教,谢谢了!!
BUF代表缓冲区(始址??)SIZE为从某文件流中读取数据到缓冲区的字节数。
我有一STRING变量:S:setlength(s,20);
下为出错代码:
tfileStream.create(filename).read(s,10):编译能通过,但运行到该句后发生ACCESSViolation异常。
修改后:tfileStream.create(filename).read(pointer(s)^,10);运行正常??!!
请各位大侠不吝指教,谢谢了!!
解决方案 »
- 三层结构数据刷新问题请教。
- dbexpress连接sql server的问题?
- 消息提示
- 怎么样手动添加一个事件????
- 急:如何识别表达式,并计算其表达式的值
- 请问哪里有详细讲解telnet用法的书或网站呀?(急)
- Label1.Caption:=Floattostr(Query1.ParamByName('winindex').asfloat) 有什么问题么,为什么系统提示数据库无'winindex'?
- string如何转换成array of byte?
- 分栏打印的问题,我给100$
- 高手请进
- 支持三J当大版 嘿嘿 是该换换界了.....(两年了放点分不容易哎~~)
- delphi6 操作oracle10g的clob类型
感觉alexanda2000更进了一步,s[1]为字符串第一字符。但BUF一般是指针啊?我就是这个不理解?!
printf(%c,*S)与printf(%c,S[0])一样的吧?
function Read(var Buffer; Count: Longint): Longint; override
BUffer显然是一个指针啊!
S[1]是个字符。这能对吗??
另外tfileStream.create(filename).read(s[1],10);是不是能运行正常,我还没试过呢,明天给答案:-)
var
Buf: array[0..1023] of char;
to lyre:你的方法是对的,数组名是指针。那字符串名到底是不是指针??
“C当中数组和指针是一回事,但在Delphi中不是”说得具体点~~
Delphi中的字符串实际上是以前Pascal短字符串与C的以0结尾的字符串的一种综合体,也就是说,最前面有几个字节保存的是字符串的长度,然后是实际内容,最后又有一个结尾的0。
回到问题:
那s[1]是不是指针?
BUF指得是一个指针变量?
如果BUF是指针,那Pointer(S)^代表的是一个字符还是指针?[参数类型匹配吗?]
S^与Pointer(S)^的区别?(STRING指针与无类型指针我知道(都4字节),但不能替换使用,否则上面程序异常。难道这就是所谓“强类型”?)
read(Var BUF;Size:int64);
其中的Buf是一个无类型参量,这种情况下调用时不限参数类型。另外Buf是作为var定义的,传递参数时是将参数的地址传进去的。(实际上无类型参数也只能用var来定义。)C语言这种情况下需要&符来取址,Delphi不需要。
read(s[1], ..); ==>传入S[1]的地址。因为String类型的第一个字符下标从1开始,所以S[1]的地址也正是字符串正文开始的地址;S虽然实际上是个指针,但这是对Delphi而言的,在引用的时候Delphi会循着S指明的地址依次找到字符串长度、内容、结尾的0等;对用户而言它是一个语言内建的数据类型而不是指针,所以S^的写法是错误的。
如果你把S强行转化为指针,将Pointer(S)^作为参数传给Read的时候,它实际指向字符串开头的字符串长度所在位置,你往这里写东西,当然就破坏了字符串的结构了;
分数将对半分给 lyre和 alexanda2000
另外 alexanda2000最后的回复是正确的,我已验证。原因我琢磨应该如下:
S作为一个“指针”来说,是一个指向STRING第一字符的指针,而不是指向长度值。
S作为一个字符串来说,S^不能用,即Delphi限制用户只能从s+1开始。
Pointer(S)^==s[1]
《Delphi5 开发人员指南》中对字符串结构有比较详细的介绍。