Королевство Дельфи"Knowledge itself is power"
F.Bacon
 Лицей
  
Главная
О лицее

Список семинаров

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  14:03[Войти] | [Зарегистрироваться]

Работа с файлами Паскаля - Расширенная работа с текстовыми файлами

Anatoly Podgoretsky
дата публикации 15-09-2003 13:37

урок из цикла: Уроки от АП


предыдущий урок содержание семинара следующий урок

Работа с файлами Паскаля - Расширенная работа с текстовыми файлами

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

Полный синтаксис процедур следующий
  procedure ReadLn(< var F: TextFile; > V1 <, V2, ...,Vn >);
  procedure WriteLn(< var F: TextFile; > P1 <, P2, ...,Pn > );
  • F - файловая переменная типа TextFile, это означает, что процедуры Readln и Writeln могут работать с текстовыми файлами и не применимы для других типов файлов. Если эта переменная опущена, то в качестве текстового файла используется консоль, это также означает, что вывод возможен на консоль и не применим для GUI приложений. На самом деле эта конструкция равносильна следующему вызову Readln(Writeln(Output). Просто это значение по умолчанию и компилятор сам подставляет эти файловые переменные, который уже описаны в модуле System. Если создано консольное приложение, то Дельфи автоматически ассоциирует эти файловые переменные с окном консоли приложения.
  • Vn – это одна или несколько переменных строкового, символьного, целочисленного или плавающего типа и также логические переменные. Возможно это не полный список типов, но можете попробовать проверить сами. Не поддержанные типа можно выводить с помощью функций преобразования в строку, например DateTimeToStr(Now).
  • Pn – это один или более параметров процедуры, которые могут являться строкой, символом, целым числом или числом с плавающей запятой. В справке по процедуре Write ошибочно указано, что в качестве параметров могут использоваться только переменные, на самом деле это могут быть как переменные, так и константные выражения.

Кроме того, справка полностью умалчивает о формате вывода данных в файл, о возможности форматирования данных непосредственно в параметрах процедуры. Форматирования вывода осуществляется в следующем виде 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, ' ', 3, ' ', ‘string’);
  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*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: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.

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

Примечание: при выводе текстовых сообщений учтите, что на консоль надо выводить в OEM кодировке, поэтому если надо вывести текст на национальном языке, то предварительно преобразуйте его из ANSI в OEM, см. главу «Текстовые файлы - домашнее задание». То есть, любой текст надо преобразовывать функцией CharToOem. Это же касается и текстовых констант в коде программы.


предыдущий урок содержание семинара следующий урок




Смотрите также материалы по темам:
[Функции для работы с файлами ]

 Обсуждение материала [ 20-09-2003 14:41 ] 5 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования