Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  156

•  TDictionary Custom Sort  3 335

•  Fast Watermark Sources  3 086

•  3D Designer  4 845

•  Sik Screen Capture  3 338

•  Patch Maker  3 551

•  Айболит (remote control)  3 656

•  ListBox Drag & Drop  3 013

•  Доска для игры Реверси  81 681

•  Графические эффекты  3 942

•  Рисование по маске  3 246

•  Перетаскивание изображений  2 627

•  Canvas Drawing  2 749

•  Рисование Луны  2 578

•  Поворот изображения  2 186

•  Рисование стержней  2 168

•  Paint on Shape  1 568

•  Генератор кроссвордов  2 235

•  Головоломка Paletto  1 767

•  Теорема Монжа об окружностях  2 229

•  Пазл Numbrix  1 685

•  Заборы и коммивояжеры  2 057

•  Игра HIP  1 282

•  Игра Go (Го)  1 230

•  Симулятор лифта  1 474

•  Программа укладки плитки  1 216

•  Генератор лабиринта  1 547

•  Проверка числового ввода  1 364

•  HEX View  1 497

•  Физический маятник  1 358

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Прочитать строку под нужным номером из текстового файла



Оформил: DeeCo

{ 
 Abstract: 
  Im trying to write a function that, given a FileName and a line number 
  returns the entire line in a string. 
}

 { 
 The following technique is useful for high-speed processing. 
 The sample program file, save it with a .pas or .dpr filename and compile it. 
}


 {$APPTYPE CONSOLE}
 uses SysUtils, Classes;

 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;
 end;

 function GrabLine2(const s: string; ALine: Integer): string;
 var
   sl: TStringList;
 begin
   sl := TStringList.Create;
   try
     sl.LoadFromFile(s);
     Result := sl[ALine - 1]; // index off by one 
  finally
     sl.Free;
   end;
 end;

 begin
   Writeln(GrabLine(ParamStr(1), StrToInt(ParamStr(2))));
   Writeln(GrabLine2(ParamStr(1), StrToInt(ParamStr(2))));
 end.

 { 

Call it like 'getline testfile.txt 20000', depending on what you call the 
.pas (or .dpr) file. For large (i.e. tens of megabytes) files, the (rather 
complex) scanning function easily beats the memory expensive StringList 
version. 

-- Barry 
}




Похожие по теме исходники

Драйвер клавиатуры под DOS

Разбиение файла на части

Текст внутри файла




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте