如何对宽字符进行文件读写(200分)

  • 主题发起人 主题发起人 taninsh
  • 开始时间 开始时间
T

taninsh

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的:
我定义了一个record,其中有元素是widestring类型的,
进行文件读写的时候不能正常读写,初步分析是对widestring类型读写有问题。
delphi中有没有直接对unicode的字符串进行读写的函数类似如C++中的_wopen
之类的函数,谢谢

如果指教得当,所有的分全部奉上
 
不可能是这个原因,读写就按照record类型就可以
 
定义成record,如果是string的话也不能正常读写的,因为string和widestring都是不定长的

你可以这样定义
String[255]
或者array[0..255] of widechar;
 
将一个结构写入到文件中,用定长的结构是比较容易处理且比较常规的做法,如果嫌浪费存储
空间或长度不好控制,用不定长的结构(指的是结构中有不定长的成员),但这样的结构要
设计好文件头,文件头的长度是固定的,其余的数据段是不定的,根据文件头里的信息读取
数据段里的内容。当然这种做法是比较麻烦的,该用哪种还要看你的具体程序需求而定。
 
补充:当你把一个结构写入文件时,如果结构里包含字符串对象(AnsiString、WideString)
等或指针对象时(字符串对象实质是一个指针对象),实际上你只能把该指针对象的指针写
到文件里,而不能把指针所指向的数据写到文件里,如果想把该指针指向的数据写到文件中,
必须把结构里的成员逐个写入文件,你可以用一个文件流(TFileStream)来完成这项工作,
但这种处理就是我在前一贴里说的后一种方法了。
 
谢谢各位的参与

其实这个是个Com文件,对外必须是Widestring;
在其他环境中,把widestring改为string,对Record的文件读写都没有问题阿
我看过widestring的说明,他和string的控制字符串长度的方法是不一样的
当然对于把结构中的内容串行化也是不错的方法,但是有多麻烦阿

有没有很简单的办法


 
可以手工写啊
先写入长度(4字节): Write(Length(s) * 2)
然后写入widestring内容(Length*2字节): Write(pwidestring(s), length * 2)

或者先将widestring转成string后再按上面的方法写入,当然不用*2了

麻烦总是不可避免的。
 
Sachow:
其实问题你这样并不能解决,你很认真,就这样吧,呵呵
算了,还是我自己想办法
 
多人接受答案了。
 
事情还没完你就发分了?不瞒你说,在我的项目中也有大量的对于BSTR的处理,而且我对于
文件操作也略有研究,你不防把情况说清楚,我相信我能帮你解决问题的。
 
Sachow:
那就向你请教了。
定义:
TAGroup = packed record
ID: Integer;
Name: WideString;
Description: WideString;
end;

写测试:
var strFileName: string;
var iFileHandle: Integer;
Group: TAGroup;
begin
Group.ID := 100;
Group.Name := 'asdfasdf';
Group.Description := 'Description';

strFileName := 'C:/123.tmp';
if FileExists(strFileName) then
iFileHandle := FileOpen(strFileName,fmOpenReadWrite)
else
iFileHandle := FileCreate(strFileName);
FileWrite(iFileHandle,Group,Sizeof(Group));
FileClose(iFileHandle);

读测试:
var strFileName: string;
var iFileHandle: Integer;
Group: TAGroup;
begin
strFileName := 'C:/123.tmp';
if FileExists(strFileName) then
iFileHandle := FileOpen(strFileName,fmOpenReadWrite)
else
iFileHandle := FileCreate(strFileName);
FileRead(iFileHandle,Group,Sizeof(Group));
FileClose(iFileHandle);

showmessage(Group.Description);

这是有问题的,而且一个很奇怪的问题,先写然后马上做读测试是没有问题的,程序一启动马上做读动作一定又问题的
我估计的内存那里有问题,这个问题你不用管。
上面代码错误的关键是在结构中的
TAGroup = packed record
ID: Integer;
Name: WideString;
Description: WideString;
end;
Name,Des不能为widestring, 如果改为string是没有问题的?
现在我要求以最简单的方式实现读写含有widestring数据的结构。

谢谢
 
后退
顶部