Реферат Курсовая Конспект
Работа с массивами динамические массивы - раздел Образование, Глава 10. Основные Приёмы Кодинга. .............................
|
Глава 10. Основные приёмы кодинга. ..................................................................................... 165
10.1 Работа с массивами (динамические массивы) ............................................................. 166
10.2 Многомерные массивы. ................................................................................................. 170
10.3 Работа с файлами............................................................................................................ 171
10.4 Работа с текстовыми файлами ...................................................................................... 174
10.5 Приведение типов .......................................................................................................... 178
10.6 Преобразование совместимых типов ........................................................................... 181
10.7 Указатели ........................................................................................................................ 182
10.8 Структуры, записи ......................................................................................................... 184
10.9 Храним структуры в динамической памяти................................................................ 186
10.10 Поиск файлов................................................................................................................ 187
10.11 Работа с системным реестром..................................................................................... 189
10.12 Потоки........................................................................................................................... 194
ы уже изучили достаточно теории, и готовы приступить к реальным примерам кодинга. В этой главе мы будем знакомиться с некоторыми приёмами кодинга и писать простые утилиты и программы.
Здесь мы познакомимся с работой с реестром и потоками. Обе эти технологии просто необходимы любому программисту. Мы напишем кучу примеров максимально приближенных к боевым.
Я постараюсь дать побольше примеров различных приёмов кодинга как это делалось в предыдущих главах. Надеюсь, что это тебе в будущем пригодится.
Эта глава будет более практическая и теории здесь
будет уже намного меньше. Да и вообще, чем дальше мы
движемся, тем меньше теории и больше практики.
Большинство материала будет посвящено сохранению и чтению данных с разных источников информации (например из файлов или реестра). Остальной материал будет описывать то, что может понадобится при работе с источниками инфы.
10.1 Работа с массивами (динамические массивы).
то одна из необходимых тем в кодинге. Мы будем достаточно часто использовать массивы при программировании, поэтому тебе необходимо прочитать эту часть полностью и понять всё, что я буду говорить.
Я, наверно очень часто говорю, что эта глава очень важна. Это действительно так, ведь я пытаюсь рассказать в своей книге самое необходимое и самое важное. Поэтому каждая её часть является необходимой. Если ты хочешь создавать удобный в понимании код, то придётся изучать различные приёмы и технологии. Я же даю необходимые основы.
Что такое массив? Это просто набор каких-то данных следующиx друг за другом. Массив в Delphi обозначается как array. Чтобы объявить переменную типа массива нужно описать её в разделе varследующим образом:
Var
r: array [длина массива] of тип данных;
Как определяется, длина массива? Очень просто, это даже похоже на геометрическое определение. Например, тебе нужен массив из 12 значений. Длина такого массива может быть [0..11]или [1..12]. В квадратных скобках ты должен поставить начальное значение массива и конечное, а между ними две точки.
Тип данных может быть любой из уже пройдённых нами. Например, тебе надо объявить массив их 12 строк, это можно сделать следующим образом:
Var
r: array [0..11] of String;
В этом примере я объявил переменную r типа массив из 12 строк.
Чтобы получить доступ к какому-то элементу, нужно написать имя переменной массива и после этого, в квадратных скобках написать номер элемента, к которому нужно получить доступ. Например, давай прочитаем 5-й элемент и запишем 7-й элемент нашего массива:
Var
r: array [0..11] of String; Str:String;
begin Str:=r[5];
r[7]:=’Привет’; end;
В этом примере я в первой строке кода присваиваю переменной Str значение пятого элемента массива (Str:=r[5];). В следующей строке я седьмому элементу присваиваю строку «Привет» (r[7]:=’Привет’;).
Давай напишем какой-нибудь пример для работы с массивами. Допустим, нам надо узнать какой сегодня день недели. Я думаю, это будет полезный примерчик.
Создай новое приложение. Брось на форму один компонент TEdit (дадим ему имя DayOfWeekEdit) и одну кнопку (дадим ей имя GetDayButton и напишем в заголовке «Узнать день недели»). У меня получилась вот такая форма:
По нажатию кнопки мы будем узнавать, какой сегодня день недели и записывать результат в строку TEdit.
procedure TForm1.GetDayButtonClick(Sender: TObject);
var day:Integer; week: array[1..7] of string;
begin week[1] := 'Воскресенье'; week[2] := 'Понедельник'; week[3] := 'Вторник'; week[4] := 'Среда'; week[5] := 'Четверг'; week[6] := 'Пятница'; week[7] := 'Суббота';
day:=DayOfWeek(Date); DayOfWeekEdit.Text:=week[day]; end;
Здесь я объявил массив week из семи элементов. После этого, я последовательно всем элементам массива присваиваю названия дней недель.
После этого, я узнаю, какой сегодня день недели. Для этого существует функция DayOfWeek. Ей нужно передать только один параметр – дату день недели которой нужно узнать. Я передаю результат работы функции Date, которая возвращает текущую дату. Получается, что DayOfWeek вернёт мне день недели текущей даты.
Вроде всё нормально, DayOfWeek возвращает не строку, в которой написано словами какой сегодня день, а число. Если функция возвращает 0, то это воскресенье, если 1 – понедельник, 2-вторник, 3 – среда и так далее. Как видишь, отсчёт идёт с воскресенья (по европейски). Точно так же я заполнял и массив: 1 – это воскресенье, 2 – понедельник и так далее.
После этого, нам надо превратить число в строку. Это делается очень просто. Нам надо получить только соответствующий элемент массива и всё. Если функция вернула нам 2, то это должен быть понедельник. В массиве под вторым номером тоже идёт «Вторник», поэтому нам просто нужно получить строку находящуюся под вторым номером в массиве. Вот именно это и происходит в последней строке week[day].
На компакт диске, в директорииПримерыГлава 10Arraysты можешь увидеть пример этой программы.
Но это мы только закрепили на практике уже пройденный материал. Давай пойдём дальше и познакомимся с динамическими массивами.
Когда ты хочешь создать динамический массив, то не надо указывать его длину. Ты просто указываешь переменную, и её тип:
r: array of integer;
В этом примере я объявил переменную r типа массив целых чисел без указания размера (как мы указывали это в квадратных скобках [0..10]).
Чтобы указать размер массива можно воспользоваться функцией SetLength. У неё два параметра:
1. 1. Переменная типа динамического массива.
2. 2. Длина массива.
Давай посмотрим всё это на практике. Создай новый проект в Delphi, брось на форму две кнопки и один компонент TListBox:
Для первой кнопки мы напишем следующий текст:
var r:array of integer; i:Integer;
begin ListBox1.Items.Clear;
SetLength(r,10);
R[i]:=i*i .//Здесь i-му элементу массива присваивается i*i.
ListBox1.Items.Add(IntToStr(i)+' в квадрате ='+IntToStr(r[i])); Эта строка добавляет новый элемент в ListBox1. Функция IntToStr переводит число в строку.
С первой процедурой мы разобрались, теперь перейдём ко второй:
type TDynArr=array of integer;
var r:TDynArr; i:Integer;
begin ListBox1.Items.Clear; SetLength(r,10);
Var
f: TFileStream;
Вот так я объявил переменную f типа объекта TFileStream. Теперь можно проинициализировать переменную.
Инициализация – выделение памяти и установка значений по умолчанию.
За инициализацию в любом объекте отвечает метод Create. Нужно просто вызвать его и результат выполнения присвоить переменной. Например, в нашем случае нужно вызвать TFileStream.Create(какие-то параметры) и результат записать в переменную f.
f := TFileStream.Create(параметры);
Давай разберёмся, какие параметры могут быть при инициализации объекта TFileStream. У этого метода Create может быть три параметра, причём последний можно не указывать:
1. 1. Имя файла (или полный путь к файлу) который надо открыть. Этот параметр – простая строка.
.2. Режим открытия. Здесь ты можешь указать один из следующих флагов:
.a. fmCreate – создать файл с указанным в первом параметре именем. Если файл уже существует, то он откроется в режиме для записи.
.b. fmOpenRead – открыть файл только для чтения. Если файл не существует, то произойдёт ошибка. Запись в файл в этом случае не возможна.
.c. fmOpenWrite – открыть файл для запись. При этом, во время записи текущее содержимое уничтожается.
.d. fmOpenReadWrite – открыть файл для редактирования (чтения и записи).
3. Права, с которыми будет открыт файл. Тут опять ты можешь указать одно из следующих значений (а можешь вообще ничего не указывать):
.a. fmShareCompat – при этих правах, другие приложения тоже имеют права работать с открытым файлом.
.b. fmShareExclusive – при этом режиме другие приложения вообще не смогут открыть файл.
.c. fmShareDenyWrite – при данном режиме другие приложения не смогут открывать этот файл для записи. Файл может быть открыт только для чтения.
.d. fmShareDenyRead – при данном режиме другие приложения не смогут открывать этот файл для чтения. Файл может быть открыт только для записи.
.e. fmShareDenyNone -вообще не мешать другим приложениям работать с файлом.
С первыми двумя параметрами всё ясно. Но зачем же нужны права доступа к файлам. Допустим, что ты открыл файл для записи. Потом его открыло другое приложение и тоже для записи. Вы оба записали какие-то данные. После этого твоё приложение закрыло файл и сохранило все изменения. Тут же другое приложение перезаписывает твои изменения, даже не подозревая о том, что они прошли. Вот так твоя инфа пропадает из файла.
Если ты пишешь однопользовательскую прогу и к файлу будет иметь доступ только одно приложение, то про права можно забыть и даже не указывать.
После того, как ты поработал с файлом, достаточно вызвать метод Free, чтобы закрыть файл.
f.Free;
Теперь давай познакомимся с методами чтения, записи и путешествия внутри файла. Начнём с путешествия. Когда ты открыл файл, позиция курсора устанавливается в самое начало и любая попытка чтения или записи будет происходить в эту позицию курсора. Если тебе надо прочитать или записать в любую другую позицию, то надо передвинуть курсор. Для этого есть метод Seek. У него есть два параметра:
1. Число, указывающее на позицию, в которую надо перейти. Если тебе нужно передвинутся на пять байт, то просто поставь цифру 5.
2. Откуда надо двигаться. Тут возможны три варианта:
. • soFromBeginning – двигаться на указанные количество байт от начала файла.
. • soFromCurrent -двигаться на указанные количество байт от текущей позиции в файле к концу файла.
. • soFromEnd – двигаться от конца файла к началу на указанное количество байт.
Не забывай, что один байт – это один символ. Единственное исключение – файлы в формате Unicode. В них один символ занимает 2 байта. Так что надо учитывать в каком виде хранится информация в файле.
Итак, если тебе надо передвинутся на 10 символов от начала файла, то ты можешь написать следующий код:
f.Seek(10, soFromBeginning);
Метод Seek всегда возвращает смещение курсора от начала файла. Этим можно воспользоваться чтобы узнать где мы сейчас находимся, а можно и узнать общий размер файла. Если переместится в конец файла, то функция вернёт нам количество байт от начала до конца, т.е. полный размер файла.
В следующем примере я устанавливаю позицию в файле на 0 байт от конца файла, т.е. в самый конец. Тем самым я получаю полный размер файла:
Размер файла := f.Seek(0, soFromEnd);
Для чтения из файла нужно использовать метод Read. . И снова у этого метода два параметра:
1. 1. Переменная, в которую будет записан результат чтения.
2. 2. Количество байт, которые надо прочитать.
Давай взглянём на код чтения из файла, начиная с 15 позиции в файле.
Var
F:TFileStream; //Переменная типа объект TFileStream.
Buf: array[0..10] of char; // Буфер, для хранения прочитанных данных begin // В следующей строчке я открываю файл filename.txt для чтения и записи.
f:= TFileStream.Create(‘c:filename.txt’, fmOpenReadWrite);
F.Seek(15, soFromCurrent); // Перемещаюсь на 15 символов вперёд. f.Read(buf, 10); // Читаю 10 символов из установленной позиции. f.Free; // Уничтожаю объект и соответственно закрываю файл.
end;
Заметь, что в методе Seek я двигаюсь на 15 символов не от начала, а от текущей позиции, хотя мне нужно от начала. Это потому что после открытия файла текущая позиция и есть начало.
Метод Read возвращает количество реально прочитанных байт (символов). Если не произошло никаких проблем, то это число должно быть равно количеству запрошенных для чтения байт. Есть только два случая, когда эти числа отличаются:
1. 1. При чтении был достигнут конец файла и дальнейшее чтение стало не возможным.
2. 2. Ошибка на диске или любая другая физическая проблема.
Осталось только разобраться с методом для записи. Для записи мы будем использовать Write. У него так же два параметра.
1. 1. Переменная, содержимое которой нужно записать.
2. 2. Число байт для записи.
Пользоваться этим методом можно точно также как и методом для чтения.
Напоследок одно замечание: после чтения или записи текущая позиция в файле
смещается на количество прочитанных байт. То есть текущая позиция становится в конец прочитанного блока данных.
Примера пока не будет, потому что в принципе и так всё ясно. А если есть вопросы, то на практике мы закрепим этот материал буквально через один или два раздела, когда будем работать с структурами.
10.4 Работа с текстовыми файлами
предыдущей части я показал общий случай работы с файлами. В этой части мы познакомимся с частным случаем – текстовые файлы. В них информация расположена не сплошным одинарным блоком, а в виде строк текста. Было
бы удобно воспринимать такие файлы в виде наборов строк.
Если мы попытаемся прочитать текстовый файл методами, описанными в прошлой части, то работать с текстом будет неудобно. Допустим, что у нас есть файл из двух строчек:
Привет!!!
Как жизнь?
Если прочитать его с помощью объекта TFileStream, то мы увидим весь текст в одну строку:
Привет!!!<CR><LF>Как жизнь?
Здесь <CR> -конец строки и <LF> -перевод каретки на новую строку. Так что, чтобы найти конец первой строки мы должны просканировать весь текст на наличие признака конца строки и перевода каретки (CR и LF). Это очень неудобно, каждый раз сканировать конец строки. А допустим, что у тебя файл из 100 строк и тебе нужно получить доступ к 75-й строке. Как ты думаешь, долго мы будем искать нужную строку? Нет, точнее сказать, что не долго, а неудобно.
Тут на помощь нам приходит объект TStrings, который является простым контейнером (хранилищем) для строк. Можно ещё пользоваться более продвинутым вариантом этого объекта TStringList. Если посмотреть на иерархию объекта TStringList (рис 1), то мы увидим, что TStringList происходит от TStrings. Это значит, что TStringList наследует себе все возможности объекта TStrings и добавляет в него новые.
Рис 1Иерархия объекта TStringList
Как всегда для работы с объектом надо объявлять переменную типа объект:
Var f:TStringList; //Переменная типа объект TStringList.
Инициализируется эта переменная как всегда методом Create. Никаких параметров не надо. Чтобы освободить память объекта и уничтожить его, как всегда применяется метод Free. Вот пример простейшего использования объекта:
Var f:TStrings; //Переменная типа объект TStringList.
Begin f:= TStringList.Create(); f.LoadFromFile(‘c:filename.txt’);// Загружаю текстовый файл f.Strings[0]; // Здесь находиться первая строчка файла f.Strings[1]; // Здесь находиться вторая строчка файла
f.Free; end;
Давай напишем пример, который будет искать в файле строку «Привет Вася»:
Var f:TStrings; //Переменная типа объект TStringList.
I: Integer; // Счётчик
Begin f:= TStringList.Create(); f.LoadFromFile(‘c:filename.txt’); // Загружаю текстовый файл
For i:=0 to f.Count-1 do // Запускаю цикл begin // Начало для цикла
If f.Strings[I] = ‘Привет Вася’ then //Если i-я строка равна нужной то
Application.MessageBox(‘Строка найдена’,
'Поиск закончен', MB_OKCANCEL)
End; // Конец для цикла
f.Free; end;
Точно так же очень просто изменять данные в файле. Например, тебе надо изменить 5-ю строку на «Прощай станция Мир». Это можно сделать следующим образом:
Var f:TStrings; //Переменная типа объект TStringList.
I: Integer; // Счётчик
Begin f:= TStringList.Create(); f.LoadFromFile(‘c:filename.txt’); // Загружаю текстовый файл
if f.Count>=5 then // Если в файле есть 5 строк то изменить f.Strings[5] = ‘Прощай станция Мир’;
Имя структуры = record Свойство1: Тип свойства1; Свойство2: Тип свойства2; ….
end;
Давай опишем структуру, в которой будут храниться параметры окна:
WindowsSize = record Left:Integer; Top:Integer; Width:Integer; Height:Integer;
end;
Я назвал новую структуру как WindowSize и объявил внутри четыре свойства: Left, Top, Width, Height.
Свойства я объявлял каждое в отдельности, хотя в данном случае все они имеют один тип и их можно просто перечислить через запятую и указать, что все они имеют целый тип:
WindowsSize = record
Left, Top, Width, Height:Integer; end;
Точно так же можно объявлять и переменные в разделе var, когда несколько переменных имеют один и тот же тип.
Теперь давай разберёмся, как можно использовать нашу структуру. Для этого надо определить переменную типа структура:
var ws: WindowSize;
Структуры – это простые сгруппированные наборы свойств, которые по умолчанию не требуют выделения памяти. Они создаются локально в стеке. Напоминаю, что стек – область памяти для хранения локальных/временный переменных. Так же следует напомнить чем отличаются локальные переменные от глобальных:
Локальные переменные – объявляются и создаются при входе в процедуру и уничтожаются при выходе. Глобальные переменные – создаются при запуске программы и уничтожаются при выходе из неё. Это значит, что глобальные переменные существуют на протяжении всего времени выполнения программы. Локальные переменные существуют, только когда выполняется код процедуры. После первого выполнения процедуры локальные переменные уничтожаются и при следующем вызове создаются снова с нулевым значением. Поэтому, если надо сохранить значение переменной после выхода из процедуры, её следует объявить как глобальную.
Итак, переменная объявлена. Инициализация и уничтожение не требуется, поэтому можно сразу же её использовать. Для доступа к переменным структуры нужно написать имя структуры и через точку указать тот параметр, который тебя интересует. Например, для доступа к параметру Left необходимо написать: ws.Left.
Давай напишем пример, который будет после закрытия программы сохранять текущие значения позиции окна в структуре, а потом эту структуру будем записывать в файл. Для записи будет использоваться простой бинарный файл, значит, воспользуемся объектом TFileStream.
Итак, создай новое приложение. В разделе Typeопиши нашу структуру:
type WindowsSize = record Left, Top, Width, Height:Integer; end;
TForm1 = class(TForm)
private
public
end;
Теперь создай обработчик события OnClose для формы. Здесь мы заполним структуру значениями позиции окна и сохраним в бинарный файл:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var ws:WindowsSize; f:TFileStream; Str:String;
Begin ws.Left:=Left; // Заполняем левую позицию ws.Top:=Top; // Заполняем правую позицию ws.Width:=Width; // Заполняем ширину окна ws.Height:=Height; // Заполняем высоту окна
f:=TFileStream.Create('size.dat', fmCreate); // Создаю файл Size.dat
f.Write(ws, sizeof(ws)); // Записываю структуру
f.Free; // Закрываю файл
end;
Обрати внимание, что при записи в файл, я должен указывать в качестве параметра буфер памяти для записи. Я указываю свою структуру. В качестве второго параметра нужно указывать размер записываемых данных. Для определения размера структуры я использую функцию SizeOf, которая вернёт мне необходимый размер.
Ну а теперь разберёмся с чтением из файла, которое происходит подобным образом:
procedure TForm1.FormShow(Sender: TObject);
var ws:WindowsSize; fs:TFileStream;
Type PWindowsSize = ^ WindowsSize; WindowsSize = record
Left, Top, Width, Height:Integer;
end;
В этом примере PWindowsSize -ссылка на структуру. Теперь, чтобы разместить нашу структуру не в стеке, а в динамической памяти мы должны использовать именно PwindowsSize:
var ws:PWindowSize;
Запускаю поиск hFindFile := FindFirst(Маска поиска, Аттрибуты , Информация); //Проверяю корректность найденного файла if hFindFile <> INVALID_HANDLE_VALUE then //Если корректно, то запускаеться цикл repeat - until.
Repeat
//Здесь вписаны операторы, которые нужно выполнять. until (FindNext(Информация) <> 0); FindClose(Информация);
FindFirst -открывает поиск. В качестве первого параметра выступает маска поиска. Если ты укажешь конкретный файл, то система найдёт его. Но это не серьёзно, лучше искать более серьёзные вещи. Например, ты можешь запустить поиск всех файлов в корне диска С. Для этого первый параметр должен быть 'C:*.*'. Для поиска только файлов ЕХЕ, в папке Fold ты должен указать 'C:Fold*.exe'.
Второй параметр -атрибуты включаемых в поиск файлов. Я использую faAnyFile, чтобы искать любые файлы. Тебе доступны
faReadOnly -искать файлы с атрибутом ReadOnly (только для чтения).
faHidden -искать скрытые файлы.
faSysFile -искать системные файлы.
faArchive -искать архивные файлы.
faDirectory -искать директории.
Последний параметр -это структура, в которой нам вернётся информация о поиске, а именно имя найденного файла, размер, время создания и т.д. После вызова этой процедуры, я проверяю на корректность найденного файла. Если всё в норме, то запускается цикл Repeat -Until.
Мы уже рассматривали с тобой циклы, но я всё же решил повториться и напомнить тебе работу используемого мной цикла. Он выполняет операторы, расположенные между repeatи until, пока условие расположенное после слова untilявляется верным. Как только условие нарушается, цикл прерывается.
Хочу предупредить, что функция поиска, может возвращать в качестве найденного имени в структуре SearchRec (параметр Name) точку или две точки. Если ты посмотришь на директорию, то таких файлов не будет. Откуда берутся эти имена? Имя файла в виде точки указывает на текущую директорию, а имя файла из двух точек указывает на директорию верхнего уровня. Если я встречаю такие имена, то я их просто отбрасываю.
Структура
Type
TSearchRec = record Time: Integer; // Время создания найденного файла Size: Integer; // Размер найденного файла Attr: Integer; // Атрибуты найденного файла Name: TFileName; // Имя найденного файла ExcludeAttr: Integer; // Исключаемые атрибуты найденного файла FindHandle: THandle; // Указатель необходимый для поиска FindData: TWin32FindData; // Структура поиска файла Winndows
end;
Функция FindNext заставляет найти следующий файл, удовлетворяющий параметрам, указанным в функции FindFirst. Этой функции нужно передать структуру SearchRec, по которой будет определено, на каком месте сейчас остановлен поиск и с этого момента он будет продолжен. Как только будет найден новый файл, функция вернёт в структуре SearchRec информацию о новом найдённом файле.
Функция FindClose закрывает поиск. В качестве единственного параметра нужно указать всё ту же структуру SearchRec.
Давай теперь напишем какой-нибудь реальный пример, который наглядно покажет работу с функциями поиска файлов. Какой бы пример тебе написать?
Давай посмотрим на структуру TSearchRec. Как видишь, она умеет возвращать размер найденного файла. Вот и тема для примера – мы напишем код, который будет определять размер указанного файла.
Создай новый проект и брось на форму два компонента TEdit и одну кнопку. Можешь ещё украсить всё это текстом. У тебя должно получиться нечто похожее на этот рисунок:
По нажатию кнопки напиши следующий текст:
Var
SearchRec:TSearchRec; begin
Ищем файл
If FindFirst(Edit1.Text,faAnyFile,SearchRec)=0 then
// Забираем размер Edit2.Text:=IntToStr(SearchRec.Size)+ 'байт';
Begin FIniFile := TRegIniFile.Create('Software'); // Инициализирую реестр
FIniFile.OpenKey('VR',true); // Открываю раздел FIniFile.OpenKey('VR-Online',true); // Открываю ещё один раздел
Свойства
Position – указывает на текущую позицию курсора в потоке. Начиная с этой позиции будет происходить чтение данных.
Size – размер данных в потоке.
Методы
CopyFrom – метод предназначен для копирования из другого потока. У него два параметра – указатель на поток, из которого надо копировать и число показывающее размер данных подлежащих копированию.
Read – прочитать данные из потока, начиная с текущей позиции курсора. У этого метода два параметра – буфер, в который будет происходить чтение и число показывающее размер данных для копирования.
Seek – переместиться в новую позицию в потоке. У этого метода два параметра:
1. Число, указывающее на позицию, в которую надо перейти. Если тебе нужно передвинутся на пять байт, то просто поставь цифру 5.
2. Откуда надо двигаться. Тут возможны три варианта:
. • soFromBeginning – двигаться на указанные количество байт от начала файла.
. • soFromCurrent -двигаться на указанные количество байт от текущей позиции в файле к концу файла.
. • soFromEnd – двигаться от конца файла к началу на указанное количество байт.
SetSize – установить размер потока. Здесь только один параметр – число, указывающее новый размер потока. Допустим, что тебе надо уменьшить размер файла. В этом случае, с помощью метода SetSize потока TFileStream ты можешь уменьшить или даже увеличить размер файла.
Write – записать данные в текущую позицию потока. У этого метода два параметра:
1. 1. Переменная, содержимое которой нужно записать.
2. 2. Число байт для записи.
Это основные методы, которые тебе могут понадобиться при работе с потоками. На практике мы ещё встретимся с подобными объектами, и ты ещё раз увидишь, как с ними работать.
– Конец работы –
Используемые теги: работа, массивами, Динамические, Массивы0.075
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Работа с массивами динамические массивы
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов