【问题标题】:Curious issue in Delphi using Stream readerDelphi中使用Stream阅读器的奇怪问题
【发布时间】:2016-10-27 12:39:12
【问题描述】:

所以我有一个二进制文件,我正在读取一个 2 字节的字值,该值是 Int16 = 43140,但是每当我在 Delphi 中读取它时它返回为 43104,我编写了代码以在 C# 中读取它测试并正确读取它只是在 Delphi 中读取不正确,看起来 0 和 4 出于某种原因正在移动位置。

  TMyHeader= packed record
     Value1       :String[20];
     Value2       :Word; // Is 43140 but reading as 43104
     Value3       :Word;
     Value4       :Word; // Is 43140 but reading as 43104
  end;

FileRead (fhandle, header, sizeof(MyHeader));

【问题讨论】:

  • 源文件中可能有 UTF-16 字符。而不是 ANSI。
  • 证明问题的minimal reproducible example 会有所帮助。不可能猜测出什么可能是错的。您的代码也没有使用 Stream 阅读器。你实际上在问什么问题?
  • 让我一起敲一个,我已经使用了 SysUtils 的 Stream reader 和 FileRead 并且都给出了相同的结果。
  • 奇怪,当我构建这个小例子时,它运行良好,我认为肯定有其他原因导致它,我需要挖掘更多......
  • 在提出无法回答的问题之前进行挖掘。像这样的问题需要minimal reproducible example

标签: delphi delphi-2007


【解决方案1】:

您的代码没有使用 Stream reader,而且读取文件的问题完全不可能。这是一个使用TFileStream 成功读取和写入记录而不以任何方式更改值的示例。 (显然,您必须首先更改 TestFile 常量以指向系统上有效的可写位置。)

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

type
  TMyHeader = packed record
    Value1: String[20];
    Value2: Word;
    Value3: Word;
    Value4: Word;
  end;

var
  MyHeader: TMyHeader;
  Stream: TFileStream;

const
  TestFile = 'E:\TempFiles\Testheader.bin';

begin
  // Initialize the record
  MyHeader.Value1 := 'Testing One Two';
  MyHeader.Value2 := 43140;
  MyHeader.Value3 := 12345;
  MyHeader.Value4 := 43140;

  // Show what it contains. The `[]` brackets are to clearly delimit Value1
  WriteLn(Format('Before write: [%s] %d %d %d', 
                  [MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4]));

  // Write it to the stream.
  Stream := TFileStream.Create(TestFile, fmCreate, fmShareDenyNone);
  try
    Stream.Write(MyHeader, SizeOf(TMyHeader));
  finally
    Stream.Free;
  end;

  // Clear the contents of MyHeader before reading back, and show the empty values
  FillChar(MyHeader, SizeOf(TMyHeader), 0);
  WriteLn(Format('Before read: [%s] %d %d %d', 
                 [MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4]));
  Stream := TFileStream.Create(TestFile, fmOpenRead, fmShareDenyNone);
  try
    Stream.Read(MyHeader, SizeOf(TMyHeader));
  finally
    Stream.Free;
  end;
  // Output what we've read back in to verify it is correct
  WriteLn(Format('After read: [%s] %d %d %d', 
                 [MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4]));
  Readln;
end.

【讨论】:

  • 我发现了问题,header有错误,1个字节,现在好像可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2023-03-04
相关资源
最近更新 更多