Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Read чтение до пробела / 11 сообщений из 11, страница 1 из 1
05.04.2021, 13:28
    #40059760
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
В консоли / текстовом файле есть строка
Код: pascal
1.
1 A B


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

Код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  LInt: Integer;
  LStr1: string;
  LStr2: string;
begin
  Read(LInt, LStr1, LStr2);
  Writeln('LInt: ', LInt);
  Writeln('LStr1: "', LStr1, '"');
  Writeln('LStr2: "', LStr2, '"');
end.

Дает такой результат
Код: plaintext
1.
2.
3.
4.
1 A B
LInt: 1
LStr1: " A B"
LStr2: ""
Т.е. в первую стоку попадает даже лидирующий пробел.

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

С уважением, Vasilisk
...
Рейтинг: 0 / 0
05.04.2021, 13:32
    #40059765
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
а readln?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.04.2021, 13:56
    #40059779
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
Мимопроходящий
а readln?
Аналогично
...
Рейтинг: 0 / 0
05.04.2021, 14:00
    #40059780
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
05.04.2021 13:56, _Vasilisk_ пишет:
>
> Аналогично
>

а через запятые, или точку с запятой?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.04.2021, 14:50
    #40059830
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
Вопрос снят. Никак
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
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
...
Рейтинг: 0 / 0
05.04.2021, 15:00
    #40059840
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
_Vasilisk_
Вопрос снят. Никак
сломали TurboPascal, сволочи
...
Рейтинг: 0 / 0
05.04.2021, 15:44
    #40059871
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
Код: pascal
1.
2.
var LInt:integer;
     LStr1,LStr2: CHAR;   // <-----


А потом уже read(); Read() для строки - все в строку и запихнет.
...
Рейтинг: 0 / 0
05.04.2021, 16:12
    #40059900
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
Мимопроходящий
сломали TurboPascal, сволочи
Не уверен, что в Паскале было по другому
...
Рейтинг: 0 / 0
05.04.2021, 20:55
    #40060004
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
_Vasilisk_

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


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

mReadln.txt

Код: pascal
1.
1 A B C



mReadln.pas


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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

Код: pascal
1.
2.
3.
4.
Is int value: 1
Is str value: A
Is str value: B
Is str value: C



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

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

з.з.ы. Запуск mReadln.exe mReadln.txt
...
Рейтинг: 0 / 0
06.04.2021, 12:13
    #40060105
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
LocksmithPC
Я попросил бы!
Сравни это
LocksmithPC
Код: pascal
1.
Readln(mrFile, sBuffer);

с этим
_Vasilisk_
Код: pascal
1.
Read(LInt, LStr1, LStr2);

Т.е. в паскале идея та же - читаем всю строку, а потом парсим по разделителю. А для входной строки
Код: pascal
1.
123 abc xyz

твой код еще и работать не будет
...
Рейтинг: 0 / 0
06.04.2021, 14:45
    #40060160
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Read чтение до пробела
_Vasilisk_


Код: pascal
1.
123 abc xyz



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



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

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


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
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.


...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Read чтение до пробела / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]