Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизТекстовый файл Найти похожие ветки
← →
Neosted (2005-11-27 19:32) [0]Как из текстового файла скопировать строку с заданным номером(т.е. вторую, третью) и как из строки скопировать один символ?
← →
begin...end © (2005-11-27 19:34) [1]Вызвать нужное количество раз ReadLn(F), затем прочитать нужную строку -- ReadLn(F, S), и скопировать символ: if Length(S) > 0 then C := S[1]. Здесь F: TextFile, S: string, C: Char.
← →
begin...end © (2005-11-27 19:36) [2]Сорри, почему-то подумал, что нужно скопировать первый символ.
if Length(S) >= N then
C := S[N],
где N -- номер символа.
← →
Neosted (2005-11-27 19:50) [3]Огромное спасибо!
← →
Gydvin © (2005-11-27 20:07) [4]чтение нужной строки
код не мойfunction GrabLine(const AFileName: string; ALine: Integer): string;
var
fs: TFileStream;
buf: packed array[0..4095] of Char;
bufRead: Integer;
bufPos: PChar;
lineStart: PChar;
tmp: string;
begin
fs := TFileStream.Create(AFileName, fmOpenRead);
try
Dec(ALine);
bufRead := 0;
bufPos := nil;
{ read the first line specially }
if ALine = 0 then
begin
bufRead := fs.Read(buf, SizeOf(buf));
if bufRead = 0 then
raise Exception.Create("Line not found");
bufPos := buf;
end else
while ALine > 0 do
begin
{ read in a buffer }
bufRead := fs.Read(buf, SizeOf(buf));
if bufRead = 0 then
raise Exception.Create("Line not found");
bufPos := buf;
while (bufRead > 0) and (ALine > 0) do
begin
if bufPos^ = #10 then
Dec(ALine);
Inc(bufPos);
Dec(bufRead);
end;
end;
{ Found the beginning of the line at bufPos... scan for end.
2 cases:
1) we"ll find it before the end of this buffer
2) it"ll go beyond this buffer and into n more buffers }
lineStart := bufPos;
while (bufRead > 0) and (bufPos^ <> #10) do
begin
Inc(bufPos);
Dec(bufRead);
end;
{ if bufRead is positive, we"ll have found the end and we can leave. }
SetString(Result, lineStart, bufPos - lineStart);
{ determine if there are more buffers to process }
while bufRead = 0 do
begin
bufRead := fs.Read(buf, SizeOf(buf));
lineStart := buf;
bufPos := buf;
while (bufRead > 0) and (bufPos^ <> #10) do
begin
Inc(bufPos);
Dec(bufRead);
end;
SetString(tmp, lineStart, bufPos - lineStart);
Result := Result + tmp;
end;
finally
fs.Free;
end;
delete(Result,length(Result),1);
end;
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.082 c