Тема: Виртовский ввод-вывод
Вот, к примеру, так можно теперь делать
WriteLn('My first program', ' ', 100500, 42:10);
Добавлено 2020-06-26 в 18:29
Теперь процедуры Write\WriteLn стали стандартными.
При их использовании появился один нюанс.
Если мы хотим вывести значение переменной типа LongWord,
то компилятор использует _Write0Int64.
Это логично, потому что есть функции для вывода Char, String, LongInt, но вот для вывода LongWord функции нет.
Поэтому компилятор его расширяет до Int64 и использует соответствующую процедуру.
Проблема в том, что консоль в данный момент не поддерживает вывод 64-битных чисел.
То есть, похоже, придётся сделать свою реализацию вывода таких чисел.
AssignFile/Reset/Rewrite
А для файлов это потребуется.
Когда мы делаем
var
F: File of AnsiChar;
MyVar: AnsiChar;
begin
AssignFile(F, 'myfile.txt');
Rewrite(F);
Reset(F);
Read(F, MyVar);
Write(F, MyVar);
CloseFile(F);
end.
то вызывается
function _Assign(var t: TTextRec; const s: String): Integer;
begin
FillChar(t, sizeof(TFileRec), 0);
t.BufPtr := @t.Buffer;
t.Mode := fmClosed;
t.Flags := tfCRLF * Byte(DefaultTextLineBreakStyle);
t.BufSize := sizeof(t.Buffer);
t.OpenFunc := @TextOpen;
Move(S[1], t.Name, Length(s));
t.Name[Length(s)] := #0;
Result := 0;
end;
по поводу TFileRec и TTextRec написано, что они "must overlay"
type
{ Typed-file and untyped-file record }
TFileRec = packed record (* must match the size the compiler generates: 332 bytes *)
Handle: Integer;
Mode: Word;
Flags: Word;
case Byte of
0: (RecSize: Cardinal); // files of record
1: (BufSize: Cardinal; // text files
BufPos: Cardinal;
BufEnd: Cardinal;
BufPtr: PChar;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..32] of Byte;
Name: array[0..259] of Char; );
end;
{ Text file record structure used for Text files }
PTextBuf = ^TTextBuf;
TTextBuf = array[0..127] of Char;
TTextRec = packed record (* must match the size the compiler generates: 460 bytes *)
Handle: Integer; (* must overlay with TFileRec *)
Mode: Word;
Flags: Word;
BufSize: Cardinal;
BufPos: Cardinal;
BufEnd: Cardinal;
BufPtr: PChar;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..32] of Byte;
Name: array[0..259] of Char;
Buffer: TTextBuf;
end;
ещё нюанс "must match the size the compiler generates"
для файлов
Name: array[0..259] of Char;
при этом константа для винды
MAX_PATH = 260;
а для линукса
MAX_PATH = 4095;
но в TFileRec\TTextRec имя не может быть больше 260 символов, а в KolibriOS на длину пути таких ограничений нет, многие используют 1024 байта под буфер для файлового пути.
Как планируется решить такой вопрос у нас в SDK для KolibriOS?
Как планируется реализовать такие функции?
AssignFile
Rewrite
Reset
Read
Write
CloseFile