- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图创建一个函数/方法,它应该写入一个文件一个用零填充的标题
header := StringOfChar(char(0), 11*offsetSize);
但是当我检查创建的文件时,它具有以下值(十六进制):
C026A200160000000100000006000000264C656B63650000B2000000B04D45005C1EA200306CA20000000000
我预计输出文件应包含
0000 0000 0000 0000 0000 0000
然后我也尝试用 chr(1)
填充它,结果类似:
C026A200160000000100000006000000264C656B63650000B2000000B04D45005C1EA200306CA20000000000
(看起来一样)。
当我在 Delphi 7 中调试时,我会观察标题是否填充了零:
#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
当我用 chr(1)
填充它时,它包含...
#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1
所以我的问题是,为什么会发生这种情况?我做错了什么,输出文件包含错误的数据?
unit Dictionary_io;
interface
uses
Classes, Windows, SysUtils, Dialogs;
const
offsetTableEntriesCount = 10;
type
TCountType = dword;
TOffsetType = dword;
TTextType = ANSIString;
const
testItemsCount = 1;
type
Dictionary = class
private
fsInput, fsOutput: TFileStream;
fileName: string;
msOffsets: TMemoryStream;
offsetSize: TOffsetType;
ofsTableEntries: TCountType;
lng: integer;
itemsCount: byte;
header: TTextType;
public
constructor Create;
procedure dicRewrite;
end;
implementation
constructor Dictionary.Create;
begin
offsetSize := sizeof(offsetSize);
end;
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
header := StringOfChar(char(0), 11*offsetSize);
try
fileName := 'A:\test.bin';
if FileExists(fileName) then
DeleteFile(fileName);
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.Write(header,Length(header));
finally
end;
finally
fsOutput.Free;
end;
end;
end.
最佳答案
您的数据未正确写入文件的原因是您未正确将 header
传递给 Write()
。 Write()
接受无类型的 var
作为输入,并且您按原样向其传递 header
变量,因此您传递 Write()
header
本身的内存地址。但是字符串
包含一个指向存储在内存中其他位置的字符数据的指针。因此,为了将该数据写入文件,您需要取消引用 string
指针,以便传入字符数据的内存地址。
此外,如果您不想检查 Write()
的返回值是否有错误,则应使用 WriteBuffer()
代替。
试试这个:
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
header := StringOfChar(#0, 11*offsetSize);
fileName := 'A:\test.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(header[1], Length(header));
finally
fsOutput.Free;
end;
end;
或者:
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
header := StringOfChar(#0, 11*offsetSize);
fileName := 'A:\test.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(PAnsiChar(header)^, Length(header));
finally
fsOutput.Free;
end;
end;
话虽这么说,您确实不应该对二进制数据使用字符串
(特别是如果您计划将项目升级到Delphi 2009+)。您应该使用记录
code> 或字节数组,例如:
private
header: array of Byte;
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
SetLength(header, 11*offsetSize);
FillChar(header[0], Length(header), #0);
fileName := 'A:\test.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(header[0], Length(header));
finally
fsOutput.Free;
end;
end;
或者:
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
SetLength(header, 11*offsetSize);
FillChar(PByte(header)^, Length(header), #0);
fileName := 'A:\test.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(PByte(header)^, Length(header));
finally
fsOutput.Free;
end;
end;
或者:
private
header: array[0..(11*offsetSize)-1] of Byte;
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
FillChar(header, Length(header), #0);
fileName := 'A:\test.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(header, SizeOf(header));
finally
fsOutput.Free;
end;
end;
关于delphi - 为什么 TFileStream.write 产生不正确的数据?德尔福7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51226714/
我有这个代码单元:(我在 Win XP sp 3 上运行 Delphi 7)。 uses Windows, Messages, SysUtils, Variants, Classes, Graph
我需要扩展 TFileStream,以便它可以处理不是从 0 偏移量开始,而是从用户定义的偏移量开始的文件。我的意思是它必须将用户定义的偏移量解释为流开始。我的代码是: type TSuFileS
TFileStream 提供缓冲输出,这在大多数情况下都很好,但在某些情况下(特别是在调试期间)最好立即刷新缓冲区。问题是,除了调用 Free 之外,我不知道有什么方法可以做到这一点,这会适得其反。
我在使用Delphi代码时遇到麻烦,这些代码使用TFileStream从文件读取数据块到动态数组。编写代码的最初目的是比较两个具有相同大小但可能具有不同日期和时间戳的文件的内容,以查看内容是否相同。通
我在 Delphi 2006 中使用 TFileStream。当我使用超出范围的偏移量调用 TFileStream.Seek 时,我得到不同的返回值。当我寻找低于流开头的位置时,该函数返回 -1,如果
我们刚刚在 Delphi 2007 中遇到了 TFileStream.Seek 的一种特殊行为(实际上该方法是从 THandleStream 继承的): 您可以在没有错误的情况下查找文件末尾之外的内容
这是取自 https://forums.embarcadero.com/message.jspa?messageID=219481 的代码片段 if FileExists(dstFile) then
我搜索了又搜索,似乎找不到任何描述我想要在delphi代码中做什么的东西。这些解决方案有时很接近,但还不足以让我弄清楚。所以我在这里问.. 我有很多位图,我正在从屏幕截图中检索它们。我一直在做的是保存
我正在使用下面的代码写入现有文件,但内容会被附加。清空文件并覆盖它需要哪些 TFileStream 选项? procedure TUtilitiesForm.btnSaveClick(Sender:
为什么这段代码不起作用? 我正在编写一个应用程序,该应用程序能够保存和加载自己的文件,并且需要知道如何使用 FileStream 将对象流式传输到文件。 procedure TForm1.btnSav
这是我关于 SO 的第二个问题,我希望我的格式正确。 我在工作中发现 TFileStream 比 TMemoryStream 慢,我真的不知道为什么会这样。因此我决定做一些测试。 在我发现这种行为的应
我正在尝试使用 TFileStream 写入和读取非固定字符串。不过,我遇到了访问冲突 错误。这是我的代码: // Saving a file (...) count:=p.Tags.Coun
我使用 Delphi 和 TmongoWire。我想插入 TFileStream (picture, pdf)在 MongoDb 服务器上使用 TmongoWire。我的工作基于这个演示文件:Delp
我正在尝试写入更大的 block 以提高文件保存的速度。我大约有 9 个循环需要转换,但我不知道我做错了什么 fs := TFileStream.Create(Myfile, fmCreate); 此
例如,我有多种记录类型可以从文件中读取 PDescriptorBlockHeader = ^TDescriptorBlockHeader; TDescriptorBlockHeader = p
我正在尝试使用 TFilestream 写入网络共享(本地)。如果网络连接不中断,一切正常。 但是,如果我拔下网络电缆然后重新连接,由于访问限制,后续尝试打开文件流会失败。我什至无法删除资源管理器中的
我想在TFileStream上实现一个进度事件以进行读/写操作,以便在其上分配一个进度条。 我已经创建了 TFileStream 的 clild 类 (TProgressFileStream): un
如何使用某些行读取文件 TFileStream.我阅读了包含数百万个文件的行。所以我想在我只会使用的内存中播放 示例: Line 1: 00 00 00 00 00 00 00 00 Line 2:
我正在使用 TIdHttp 下载文件,然后使用 TIdHashMessageDigest5 检查其 MD5 哈希值,如下所示: http := TIdHttp.Create(); fs := TFil
这份QC报告说Delphi不支持文件共享模式FILE_SHARE_DELETE http://qc.embarcadero.com/wc/qcmain.aspx?d=45628 我需要将此模式与 TF
我是一名优秀的程序员,十分优秀!