Буферизация ввода в строку

Исправление ошибки вывода лишнего пробела при s.Println
This commit is contained in:
Mikhalkovich Stanislav 2024-03-19 18:46:20 +03:00
parent f811066d7e
commit 6f158a6bef
9 changed files with 137 additions and 50 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "9";
public const string Build = "0";
public const string Revision = "3436";
public const string Revision = "3438";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3436
%REVISION%=3438
%MINOR%=9
%MAJOR%=3

View file

@ -100,12 +100,13 @@
if</code> ëîãè÷åñêèå âûðàæåíèÿ;<code><br>
w</code> öèêëû ñ óñëîâèåì;<code><br>
ñif</code> öèêëû + ëîãè÷åñêèå âûðàæåíèÿ;<code><br>
count</code> переменные-счетчики;<code><br>
count</code> переменные-счетчики;<br>
<code>mix</code> смешанные задачи;<br>
cc</code> âëîæåííûå öèêëû;<code><br>
p</code> ïðîöåäóðû áåç ïàðàìåòðîâ;<code><br>
pp</code> ïðîöåäóðû ñ ïàðàìåòðàìè.
</blockquote>
<p>Для создания стандартного поля размера 9 x 11
<p>Для создания стандартного поля размера 7 x 9
èñïîëüçóåòñÿ ïðîöåäóðà <code><a name="StandardField">StandardField</a></code> áåç ïàðàìåòðîâ, à äëÿ ñîçäàíèÿ
ïîëÿ ðàçìåðà N x M &#151; ïðîöåäóðà <code><a name="Field">Field</a>(N,M)</code>.
Ðîáîò ïðè ýòîì ïîìåùàåòñÿ â öåíòð ïîëÿ.</p>

View file

@ -1 +1 @@
3.9.0.3436
3.9.0.3438

View file

@ -1 +1 @@
!define VERSION '3.9.0.3436'
!define VERSION '3.9.0.3438'

View file

@ -343,8 +343,12 @@ type
/// Стандартная подсистема ввода-вывода
IOStandardSystem = class(IOSystem)
state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
sym: integer; // буфер в 1 символ для моделирования Peek в консоли
//state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
//sym: integer; // буфер в 1 символ для моделирования Peek в консоли
// SSM 28/02/24 - новая концепция для считывания из консоли без редиректа: буфер на одну строку
read_buf := new char[0];
rblen := 0;
rbpos := 0;
buf: array of char := new char[buflen];
pos := 0;
realbuflen := -1; // только вначале
@ -352,6 +356,7 @@ type
public
constructor Create;
procedure ReadNextBuf;
procedure ReadNextConsoleBuf;
function peek: integer; virtual;// использует state и sym (стар) или буфер buf (нов)
function read_symbol: char; virtual;// использует state и sym (стар) или буфер buf (нов)
procedure read(var x: integer); virtual;
@ -5452,6 +5457,14 @@ begin
pos := 0;
end;
procedure IOStandardSystem.ReadNextConsoleBuf;
begin
var sbuf := Console.ReadLine + NewLine;
read_buf := sbuf.ToCharArray;
rbpos := 0;
rblen := read_buf.Length;
end;
var
_IsPipedRedirectedQuery := False;
@ -5492,14 +5505,18 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
if state = 1 then // в sym - символ, считанный предыдущим Peek
{if state = 1 then // в sym - символ, считанный предыдущим Peek
Result := sym
else // в sym ничего нет
begin
state := 1;
sym := Console.Read(); // считываение в буфер из одного символа
Result := sym;
end;
end; }
// SSM 28.02.23
if rbpos >= rblen then // буфер строки пуст
ReadNextConsoleBuf;
Result := integer(read_buf[rbpos]);
end;
end;
@ -5518,7 +5535,7 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
if state = 1 then // в sym - символ, считанный предыдущим Peek
{if state = 1 then // в sym - символ, считанный предыдущим Peek
begin
state := 0;
Result := char(sym);
@ -5526,7 +5543,12 @@ begin
end
else // в sym ничего нет
Result := char(Console.Read());
exit;
exit;}
// SSM 28.02.23
if rbpos >= rblen then // буфер строки пуст
ReadNextConsoleBuf;
Result := read_buf[rbpos];
rbpos += 1;
end;
end;
@ -5608,14 +5630,25 @@ begin
begin
if not console_alloc then
AllocConsole;
if state = 1 then
{if state = 1 then
begin
state := 0;
Result := char(sym) + Console.ReadLine;
sym := -1;
end
else
Result := Console.ReadLine;
Result := Console.ReadLine;}
// SSM 28.02.23
if rbpos >= rblen then // буфер строки пуст
ReadNextConsoleBuf;
// Проблема - там может уже оставаться 1 или 2 символа. Если так, то строка будет пустой!
var remlen := rblen - rbpos - NewLine.Length;
if remlen <= 0 then
Result := ''
else Result := string.Create(read_buf,rbpos,remlen);
rbpos := rblen;
end;
end;
@ -7206,36 +7239,42 @@ procedure Print(params args: array of object);
begin
if args.Length = 0 then
exit;
if PrintDelimDefault<>'' then
for var i := 0 to args.length - 1 do
for var i := 0 to args.length - 1 do
if PrintDelimDefault<>'' then
Write(args[i], PrintDelimDefault)
else
for var i := 0 to args.length - 1 do
Write(args[i])
else Write(args[i]);
end;
procedure Println(params args: array of object);
begin
Print(args);
Writeln;
if args.Length = 0 then
exit;
for var i := 0 to args.length - 2 do
if PrintDelimDefault<>'' then
Write(args[i], PrintDelimDefault)
else Write(args[i]);
Writeln(args[args.Length-1]);
end;
procedure Print(f: Text; params args: array of object);
begin
if args.Length = 0 then
exit;
if PrintDelimDefault<>'' then
for var i := 0 to args.length - 1 do
for var i := 0 to args.length - 1 do
if PrintDelimDefault<>'' then
Write(f, args[i], PrintDelimDefault)
else
for var i := 0 to args.length - 1 do
Write(f, args[i])
else Write(f, args[i])
end;
procedure Println(f: Text; params args: array of object);
begin
Print(f, args);
Writeln(f);
if args.Length = 0 then
exit;
for var i := 0 to args.length - 2 do
if PrintDelimDefault<>'' then
Write(f, args[i], PrintDelimDefault)
else Write(f, args[i]);
Writeln(f, args[args.Length-1]);
end;
procedure Serialize(fileName: string; obj: object);

View file

@ -343,8 +343,12 @@ type
/// Стандартная подсистема ввода-вывода
IOStandardSystem = class(IOSystem)
state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
sym: integer; // буфер в 1 символ для моделирования Peek в консоли
//state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
//sym: integer; // буфер в 1 символ для моделирования Peek в консоли
// SSM 28/02/24 - новая концепция для считывания из консоли без редиректа: буфер на одну строку
read_buf := new char[0];
rblen := 0;
rbpos := 0;
buf: array of char := new char[buflen];
pos := 0;
realbuflen := -1; // только вначале
@ -352,6 +356,7 @@ type
public
constructor Create;
procedure ReadNextBuf;
procedure ReadNextConsoleBuf;
function peek: integer; virtual;// использует state и sym (стар) или буфер buf (нов)
function read_symbol: char; virtual;// использует state и sym (стар) или буфер buf (нов)
procedure read(var x: integer); virtual;
@ -5452,6 +5457,14 @@ begin
pos := 0;
end;
procedure IOStandardSystem.ReadNextConsoleBuf;
begin
var sbuf := Console.ReadLine + NewLine;
read_buf := sbuf.ToCharArray;
rbpos := 0;
rblen := read_buf.Length;
end;
var
_IsPipedRedirectedQuery := False;
@ -5492,14 +5505,18 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
if state = 1 then // в sym - символ, считанный предыдущим Peek
{if state = 1 then // в sym - символ, считанный предыдущим Peek
Result := sym
else // в sym ничего нет
begin
state := 1;
sym := Console.Read(); // считываение в буфер из одного символа
Result := sym;
end;
end; }
// SSM 28.02.23
if rbpos >= rblen then // буфер строки пуст
ReadNextConsoleBuf;
Result := integer(read_buf[rbpos]);
end;
end;
@ -5518,7 +5535,7 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
if state = 1 then // в sym - символ, считанный предыдущим Peek
{if state = 1 then // в sym - символ, считанный предыдущим Peek
begin
state := 0;
Result := char(sym);
@ -5526,7 +5543,12 @@ begin
end
else // в sym ничего нет
Result := char(Console.Read());
exit;
exit;}
// SSM 28.02.23
if rbpos >= rblen then // буфер строки пуст
ReadNextConsoleBuf;
Result := read_buf[rbpos];
rbpos += 1;
end;
end;
@ -5608,14 +5630,25 @@ begin
begin
if not console_alloc then
AllocConsole;
if state = 1 then
{if state = 1 then
begin
state := 0;
Result := char(sym) + Console.ReadLine;
sym := -1;
end
else
Result := Console.ReadLine;
Result := Console.ReadLine;}
// SSM 28.02.23
if rbpos >= rblen then // буфер строки пуст
ReadNextConsoleBuf;
// Проблема - там может уже оставаться 1 или 2 символа. Если так, то строка будет пустой!
var remlen := rblen - rbpos - NewLine.Length;
if remlen <= 0 then
Result := ''
else Result := string.Create(read_buf,rbpos,remlen);
rbpos := rblen;
end;
end;
@ -7206,36 +7239,42 @@ procedure Print(params args: array of object);
begin
if args.Length = 0 then
exit;
if PrintDelimDefault<>'' then
for var i := 0 to args.length - 1 do
for var i := 0 to args.length - 1 do
if PrintDelimDefault<>'' then
Write(args[i], PrintDelimDefault)
else
for var i := 0 to args.length - 1 do
Write(args[i])
else Write(args[i]);
end;
procedure Println(params args: array of object);
begin
Print(args);
Writeln;
if args.Length = 0 then
exit;
for var i := 0 to args.length - 2 do
if PrintDelimDefault<>'' then
Write(args[i], PrintDelimDefault)
else Write(args[i]);
Writeln(args[args.Length-1]);
end;
procedure Print(f: Text; params args: array of object);
begin
if args.Length = 0 then
exit;
if PrintDelimDefault<>'' then
for var i := 0 to args.length - 1 do
for var i := 0 to args.length - 1 do
if PrintDelimDefault<>'' then
Write(f, args[i], PrintDelimDefault)
else
for var i := 0 to args.length - 1 do
Write(f, args[i])
else Write(f, args[i])
end;
procedure Println(f: Text; params args: array of object);
begin
Print(f, args);
Writeln(f);
if args.Length = 0 then
exit;
for var i := 0 to args.length - 2 do
if PrintDelimDefault<>'' then
Write(f, args[i], PrintDelimDefault)
else Write(f, args[i]);
Writeln(f, args[args.Length-1]);
end;
procedure Serialize(fileName: string; obj: object);

Binary file not shown.

View file

@ -173,6 +173,14 @@ begin
|
end.
[grabc]
uses GraphABC;
begin
|
end.
[wf]
{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}