Delphi-Help

Главная

Пример работы с тестовыми файлами

Оцените материал
(0 голосов)


Пример работы с тестовыми файлами

Кроме работы со строками в текстовых файлах, Паскаль поддерживает и более расширенные методы, можно оперировать и данными в строке. Можно читать данные из строки в одну или более переменных. Паскаль сам обеспечивает разбор строки на составляющие части.

Полный синтаксис процедур следующий

procedure ReadLn([ var F: TextFile; ] V1 [, V2, ...,Vn ]);
procedure Writeln([ var F: TextFile; ] P1 [, P2, ...,Pn ] );

· F - файловая переменная типа TextFile, это означает, что процедуры ReadLn и Writeln могут работать с текстовыми файлами и не примени для других типов файлов. Если эта переменная опущена, то в качестве текстового файла используется консоль, это также означает, что вывод возможен на консоль и не применим для GUI приложений. На самом деле эта конструкция равносильна следующему вызову ReadLn([Input) или Writeln(Output). Просто это значение по умолчанию и компилятор сам подставляет эти файловые переменные, который уже описаны в модуле System. Если создано консольное приложение, то Дельфи автоматически ассоциирует эти файловые переменные с окном консоли приложения.

· Vn – это одна или несколько переменных строкового, символьного, целочисленного или плавающего типа и также логические переменные. Возможно это не полный список типов, но можете попробовать проверить сами. Не поддержанные типа можно выводить с помощью функций преобразования в строку, например DateTimeToStr(Now).

· Pn – это один или более параметров функции, которые могут являться строкой, символом, целым числом или числом с плавающей запятой. В справке по процедуре Write (Delphi 5) ошибочно указано, что в качестве параметров могут использоваться только переменные, на самом деле это могут быть как переменные, так и константные выражения.

Кроме того, справка полностью умалчивает о формате вывода данных в файл, о возможности форматирования данных непосредственно в параметрах процедуры. Форматирования вывода осуществляется в следующем виде X [:Width [:Decimals]], где Width общая длина вывода, а Decimals это количество знаков после десятичной точки. Для получения нужной длины вывода слева добавляется нужное количество пробелов, если результат не помещается в указанную длину, то тогда длина увеличивается до должного количества знаков.

Спецификатор Decimals применим только к числам с плавающей запятой. При этом при необходимости производится округление числа. Если спецификаторы не указаны, то для вывода используется научный формат, то есть #.##############E+####

Для целочисленных чисел, строк и символов, без указания длины используется столько символов, что бы значение полностью вывелось.

Значения выводятся без разделителей между ними, поэтому надо или использовать длину на один символ больше нужной или вставлять в список параметров пробел, например, так

Writeln(F, A,' ',B,' ',C);

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

WriteLn(F, 1, ' ', 2.5:3:1, ' ', ‘string’, ' ', 3);
ReadLn(F, Int1, Real1, Str1, Int2);

В файле будет следующая информация

“1 2.5 string 3”

После считывания значения переменных следующие:

Int1  = 1
Real1 = 2.5
Str1  = string 3
Int2  = 0

Правильно написать так

WriteLn(F, 1, ' ', 2.5:3:1, ' ', ‘string’, ' ', 3);
ReadLn(F, Int1, Real1, Int2, Str1);

Теперь в переменных правильные значения:

Int1  = 1
Real1 = 2.5
Int2  = 3
Str1  = string

Ну и напоследок напишем простой пример чтения и записи двухмерного массива в файл.

var
  Column: Integer;
  F: TextFile;
  IntArray: array[1..10, 1..3] of Integer;
  Row: Integer;
  S: string;
  TmpInt: Integer;
begin
  // Инициализация
  for Row := 1 to 10 do
  begin
    for Column := 1 to 3 do
    begin
      IntArray[Row, Column] := Row*100 + Column;
    end;
  end;
 
  AssignFile(F, 'Test.txt');
  try
    Rewrite(F);  // открытие для записи
    for Row := 1 to 10 do
    begin
      for Column := 1 to 3 do
      begin
        Write(F, IntArray[Row, Column]:11);
      end;
      WriteLn(F, '  Строка: ', Row);
    end;
  finally
    CloseFile(F);
  end;
 
  // Чтение
  try
    WriteLn('Test Reading');
    Reset(F);  // открытие для чтения
    for Row := 1 to 10 do
    begin
      for Column := 1 to 3 do
      begin
        Read(F, TmpInt);
        Write(TmpInt:11);
      end;
      ReadLn(F, S);
      WriteLn(S);
    end;
  finally
    CloseFile(F);
  end;
  Readln;  // Закрытие окна по ENTER
end.

После проверки, можете открыть файл Блокнотом и убедиться, что он действительно текстовый.

Прочитано 7266 раз

Авторизация



Счетчики