我正在使用Delphi Prism并使用BinaryWriter创建和写入二进制文件,如下所示。
method TUnit.Write(bw:BinaryWriter);
var
i:Integer;
begin
bw.write(ord(uType));
bw.Write(ord(State));
bw.Write(Address);
bw.Write(SubAddress);
for i:=1 to 20 do
bw.Write(fDefs[i]);
end;
我的问题是这个。 write方法是否在每行或每个字节后写入字符或字符后的字符没有换行符或回车符?
我问这个问题的原因是因为我在编写和阅读字符串时感到很困惑,没有像字符数组这样的特定字符数字。
例如:
method WritetoFile;
var
x:integer;
thestr:string;
begin
BinaryWriter thefile := new BinaryWriter(File.Create("test.dat"));
thefile.write(thestr);
thefile.write(x);
thefile.Close;
end;
method ReadFromFile;
var
x:integer;
thestr:string;
begin
BinaryReader thefile := new BinaryReader(File.OpenRead("test.dat"));
thestr:=thefile.ReadString;
x:=thefile.ReadInt32;
thefile.Close;
end;
这就是我编写程序的方式,它似乎工作得很好,但正如我所说,我很困惑。
如果字符串数据类型没有给出特定的读取长度,它如何知道读取或写入的字节数或字符长度是多少?
答案 0 :(得分:4)
BinaryWriter“Write方法”的工作方式与Delphi的Writeln方法相同吗?
不,不。
如果字符串数据类型没有给出特定的读取长度,它如何知道读取或写入的字节数或字符长度是多少?
在很多方面,您并不需要知道BinaryWriter
和BinaryReader
是如何做到的。您正确使用它。您只需将每个Write()
来电与相应类型的匹配ReadXXX()
来电配对。
documentation确实描述了基础二进制文件格式。您不需要写入或读取字符串的长度,因为二进制I / O类代表您完全执行此操作。
以长度为前缀的字符串表示字符串长度,方法是在字符串前面加上包含该字符串长度的单个字节或单词。此方法首先将字符串的长度写为UTF-7编码的无符号整数,然后使用BinaryWriter实例的当前编码将该多个字符写入流中。
所以你可以安全地写一个包含换行符的字符串,当它被读取时,这些换行符将被保留。
答案 1 :(得分:2)
不,不。您希望使用StreamWriter,它具有您想要的WriteLine和Write方法。 binaryReader / Writer类使用Length的前缀整数,然后写入数据。