Delphi Prism: работает ли BinaryWriter «Метод записи» так же, как метод Writeln из Delphi? - PullRequest
1 голос
/ 09 сентября 2011

Я работаю с 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;

Вот как я написал свою программу, и она, кажется, работает нормально, но, как я уже сказал, я в замешательстве.

Как он узнает, сколько байтов или символов длина для чтения или записи, когда он является строковым типом данных, не задавая ему конкретные числа длины для чтения?

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

Работает ли BinaryWriter «Метод записи» так же, как метод Writeln от Delphi?

Нет, не работает.

Откуда он знает, сколькодлина в байтах или символах для чтения или записи, когда это строковый тип данных без указания длины для чтения?

Во многих случаях вам не нужно знать, как BinaryWriterи BinaryReader делает это.Вы используете это правильно.Вам просто нужно связать каждый вызов Write() с соответствующим вызовом ReadXXX() соответствующего типа.

Документация описывает базовый двоичный формат файла.Вам не нужно писать или читать длину строки, так как классы двоичного ввода-вывода делают именно это от вашего имени.

Строка с префиксом длины представляет длину строки путем добавления префикса кстрока один байт или слово, которое содержит длину этой строки.Этот метод сначала записывает длину строки в виде целого числа без знака в кодировке UTF-7, а затем записывает столько символов в поток, используя текущую кодировку экземпляра BinaryWriter.

Таким образом, вы можете безопасно написатьстрока, которая содержит перевод строки и когда она прочитана, эти переводы строки будут сохранены.

2 голосов
/ 09 сентября 2011

Нет, это не так.Вы хотите использовать StreamWriter для этого, у которого есть методы WriteLine и Write, которые делают то, что вы хотите.Классы binaryReader / Writer используют префиксное целое число для длины, затем записывают данные.

...