Неглядел на работу бибки,но вроде в стандартной и так для чтения используется указатель и какая разница на что, на строку или на массив байт. Может и ошибаюсь, пока не могу до КДС35 добраться
Да, действительно, функциональному блоку чтения файла(FILE.Read) можно подать на вход указатель на массив байт.
Далее проанализировав массив байт найти начало и конец нужной строки.
Далее установить позицию чтения (FILE.Setpos), длину читаемой строки и повторно считать нужную строку (FILE.Read) в буфер типа String[255].
Добрый день. Хочу внести одно небольшое, но крайне значимое замечание.
Если вдруг в файле по какой либо причине встретятся два последовательных байта, значения которых равняются нулю, то при чтении данных в формате string вы часть данных не увидите/потеряете, т.к. два нулевых байта подряд признак конца строки.
http://ru.wikipedia.org/wiki/%D0%9F%...BE%D0%BA%D0%B8 не нашел про два нулевых байта для текстовых документов
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Capzap, в этом то и дело, в идеале в документе, который изначально создан как текстовый такой ситуации возникать не должно.
Но если она вдруг возникнет....
Или, например файл битый (запись не прошла корректно или питание в этот момент пропало). Поэтому в идеале конечно не помешало бы сделать проверку файла или читать данные блоками и искать в них нули.
Не совсем понятно преимущество.
Например:
var
array_string: ARRAY[0..10] OF STRING;
array1 [0..10] of byte;
FileOpen : File.Open;
FileRead : File.Read;
end_var
открываем файл
FileOpen(.........);
читаем файл
FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array_string[0]), szBuffer:=..........);
В чем преимущество указывать на массив pBuffer:= ADR(array_string[0]), не пойму?
Или реч идет об указании FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array1), szBuffer:=..........);?
А если реч идет о втором варианте, то массив при файле в десяток мегабайт должен быть наверно 0...1000000, его чтение и обработка займет продолжительное время.
Последний раз редактировалось arlyn; 03.02.2014 в 08:15.
var
string_line: string[255];
array1 [0..10] of byte;
FileOpen : File.Open;
FileRead: File.Read;
Setpos :File.SetPos;
end_var
Для начала считываете в массив байтов
FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(array1), szBuffer:=..........)
Затем анализируете массив, ищите начало и конец нужной строки
Далее
Setpos(.........)
Далее считываете уже нужную строку
FileRead(xExecute:= TRUE, hFile:= ........., pBuffer:= ADR(string_line), szBuffer:=..........)
Последний раз редактировалось arlyn; 03.02.2014 в 14:25.
Ну в том то и дело, что вам не надо читать всегда весь файл. Конечно, если файл небольшой его можно загрузить в ОЗУ (считать в массив) и дальше обрабатывать. Но если файл заранее не оговорен в размерах, то лучше читать его кусочками и далее ориентироваться по укзателю, где вы находитесь.