Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Read чтение до пробела  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
В консоли / текстовом файле есть строка
1 A B

Вопрос можно ли A и B считать в разные переменные?

Код
var
  LInt: Integer;
  LStr1: string;
  LStr2: string;
begin
  Read(LInt, LStr1, LStr2);
  Writeln('LInt: ', LInt);
  Writeln('LStr1: "', LStr1, '"');
  Writeln('LStr2: "', LStr2, '"');
end.
Дает такой результат
1 A B
LInt: 1
LStr1: " A B"
LStr2: ""
Т.е. в первую стоку попадает даже лидирующий пробел.

Про считать сразу всю строку, а потом вызвать Str.Split(' ') знаю. Интересно можно ли заставить работать Read()?

С уважением, Vasilisk
5 апр 21, 13:28    [22304390]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

а readln?

Posted via ActualForum NNTP Server 1.5

5 апр 21, 13:32    [22304396]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Мимопроходящий
а readln?
Аналогично
5 апр 21, 13:56    [22304419]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

05.04.2021 13:56, _Vasilisk_ пишет:
>
> Аналогично
>

а через запятые, или точку с запятой?

Posted via ActualForum NNTP Server 1.5

5 апр 21, 14:00    [22304421]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Вопрос снят. Никак
+
function ReadAnsiLineEx2(var t: TTextRec; buf: Pointer; maxLen: Integer; var Count: Integer): Pointer;
var
  c : Byte;
  eof: Boolean;
  p : PByte;
begin
  if t.MBCSLength <> 0 then
    Exit(ReadAnsiLineEx(t, buf, maxLen, Count, t.CodePage));

  Result := @t;
  Count := 0;

  if t.Mode <> fmInput then
    if not TryOpenForInput(t) then
      exit;

  if maxLen <= 0 then Exit;

  p := PByte(buf);
  while (maxLen > 0) do
  begin
    c := _ReadByte(t, eof);
    if eof then Exit;
    if c = cLF then
    begin
      Dec(t.BufPos);
      Exit;
    end
    else if c = cCR then
    begin
      c := _ReadByte(t, eof);
      if (c = cEOF) then Exit;
      if c = cLF then
      begin
        _PushCRLF(t);
        Exit;
      end
      else
      Dec(t.BufPos);
      continue;
    end
    else
    begin
      p^ := c;
      Inc(p);
      Dec(maxLen);
      inc(Count);
    end;
  end;
end;
Только три условия выхода: Eof, CR, LF
5 апр 21, 14:50    [22304499]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
_Vasilisk_
Вопрос снят. Никак
сломали TurboPascal, сволочи
5 апр 21, 15:00    [22304513]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6463
var LInt:integer;
     LStr1,LStr2: CHAR;   // <-----

А потом уже read(); Read() для строки - все в строку и запихнет.

Сообщение было отредактировано: 5 апр 21, 15:37
5 апр 21, 15:44    [22304559]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Мимопроходящий
сломали TurboPascal, сволочи
Не уверен, что в Паскале было по другому
5 апр 21, 16:12    [22304605]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
LocksmithPC
Member

Откуда:
Сообщений: 268
_Vasilisk_

Вопрос снят. Никак


Я попросил бы!

mReadln.txt

1 A B C


mReadln.pas

+

program mReadln;

{$M $4000, 0, 0}

uses
  Crt, Dos;

var
  mrFile: Text;

  sBuffer: string;

  pCount: Integer;

  mChar: Char;

begin
  ClrScr;

  Assign(mrFile, ParamStr(1));

  {$I-}

  Reset(mrFile);

  {$I+}

  if IOResult = 0 then
    begin
      Readln(mrFile, sBuffer);

      Close(mrFile);

      SwapVectors;

      Exec(ParamStr(0), sBuffer);

      SwapVectors;
    end

  else
    for pCount := 1 to ParamCount do
      begin
        sBuffer := Copy(ParamStr(pCount), 1, 1);

        mChar := sBuffer[1];

        if mChar in ['0'..'9'] then
          Writeln('Is int value: ', ParamStr(pCount));

        if UpCase(mChar) in ['A'..'Z'] then
          Writeln('Is str value: ', ParamStr(pCount));
      end;
end.



Alt + F5

Is int value: 1
Is str value: A
Is str value: B
Is str value: C


Вот, что водка жывотворящая в пн. делает.

з.ы. Память уже не та, поэтому вытаскивал Char из String отдельно.

з.з.ы. Запуск mReadln.exe mReadln.txt

Сообщение было отредактировано: 5 апр 21, 20:55
5 апр 21, 20:55    [22304790]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
LocksmithPC
Я попросил бы!
Сравни это
LocksmithPC
Readln(mrFile, sBuffer);
с этим
_Vasilisk_
Read(LInt, LStr1, LStr2);
Т.е. в паскале идея та же - читаем всю строку, а потом парсим по разделителю. А для входной строки
123 abc xyz
твой код еще и работать не будет

Сообщение было отредактировано: 6 апр 21, 12:06
6 апр 21, 12:13    [22304978]     Ответить | Цитировать Сообщить модератору
 Re: Read чтение до пробела  [new]
LocksmithPC
Member

Откуда:
Сообщений: 268
_Vasilisk_


123 abc xyz


твой код еще и работать не будет



Нихрена ты в прыжке умеешь как!

И почему не будет? Анализ считанных данных переделаю и получу все тоже самое.

+

program mReadln;

{$M $4000, 0, 0}

uses
  Crt, Dos;

var
  mrFile: Text;

  pCount: Integer;

  sBuffer: string;
  iBuffer: Integer;
  iError: Integer;
  

begin
  ClrScr;

  Assign(mrFile, ParamStr(1));

  {$I-}

  Reset(mrFile);

  {$I+}

  if IOResult = 0 then
    begin
      Readln(mrFile, sBuffer);

      Close(mrFile);

      SwapVectors;

      Exec(ParamStr(0), sBuffer);

      SwapVectors;
    end

  else
    for pCount := 1 to ParamCount do
      begin
        sBuffer := ParamStr(pCount);

        Val(sBuffer, iBuffer, iError);

        if iError = 0 then
          Writeln('Is int value: ', iBuffer)

        else
          Writeln('Is str value: ', sBuffer);

      end;
end.



Сообщение было отредактировано: 6 апр 21, 14:38
6 апр 21, 14:45    [22305068]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить