Читать строку в переменные - PullRequest
0 голосов
/ 24 апреля 2018

Я вырваюсь из своих волос!

Я пытаюсь помочь одному из моих падаванов с бесплатным паскалем.

Я застрял в самом начале. Что я хочу сделать, так это ничего другого, просто прочитать строку файла в переменные.

Структура файла просто:

CityNameWithoutSpace ProductName ProductCount

Вот мой код:

procedure TmainForm.readProcutsBtnClick(Sender: TObject);

var
  i: Integer;
  productCity: string;
  productName: string;
  productCount: Integer;
  productFileIn: TextFile;

begin

  assignFile(productFileIn, 'termek.txt');
  reset(productFileIn);
  i := 0;
  while not EOF(productFileIn) do
      begin
         i := i + 1;
        readLn(productFileIn, productCity, productName, productCount);
  end;
  closefile(productFileIn);

end;                    

Проблема в том, что он выдает исключение.

Если я просто использую readLn(productFileIn, productCity);, это работает. productCity будет весь ряд.

Но как я могу разбить строку по пробелам на эти переменные?

EDIT:

Док так беден и совершенно сбивает с толку: readLn ссылка на read , читать использовать "магию" Я действительно не понимаю char C.

1 Ответ

0 голосов
/ 24 апреля 2018

Самое простое, что нужно сделать - это прочитать всю строку в одну строку, а затем разбить ее на переменные.Как говорит @Rudy, операция ReadLn() для строк не может знать, как разделить строку.

См. Мой пример ниже, где весь файл загружен в список строк.После этого все элементы списка разбиваются на массив записей продуктов.

type
  TProductRec = record
    productCity: string;
    productName: string;
    productCount: Integer;
  end;

var
  productArray : array of TProductRec;
  aList : TStringList;
  i : Integer;
  sArray : TStringArray;
begin
  aList := TStringList.Create;
  try
    aList.LoadFromFile('termek.txt');
    SetLength(productArray,aList.Count);
    for i := 0 to aList.count-1 do begin
      sArray := aList[i].Split([' ']);
      if Length(sArray) = 3 then begin
        productArray[i].productCity := sArray[0];
        productArray[i].productName := sArray[1];
        productArray[i].productCount := StrToInt(sArray[2]);
      end;
    end;
    // Do something with the product record array
  finally
    aList.Free;
  end;
end;

// Отказ от ответственности: не проверено, но вы получите изображение

...