Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

считывание опред. строки


funky ©   (2006-10-16 18:39:00) 

Привет. Уважаемые мастера, помогите подправить код:

<...>
while not textCNTi = textcount do
begin
 inc(textCNTi);
 ReadLn (CFile,s);
 if EOF(CFile) then
  begin
   i := i-1;
   instext := 0;
   exit;
  end;
end;
 ReadLn (CFile,s);
<...>
суть кода в том, что бы считать именно ту строчку из файла, которая указана в переменной textcount, и занести ей в переменную s. Если же в файле 3 строчки, а в textcount=5, тогда выход.


Орион   (2006-10-17 10:04:00) [1]

нда... собсно как и говорил)) а индекс я наращивать забыл :)

CurrLine:=1;
while not Eof(f) do
begin
Readln(f, Buf);
if CurrLine=Line then Break;
Inc(CurrLine);
end;
if CurrLine<>Line then Buf:=''; //Ошибка здесь, например в файле 100 строк, а мы просим 101 :)


Орион   (2006-10-17 10:03:00) [2]

CurrLine:=1;
while not Eof(f) do
begin
 Readln(f, Buf);
 if CurrLine=Line then Break;
end;
if CurrLine<>Line then Buf:=''; //Ошибка здесь, например в файле 100 строк, а мы просим 101 :)

это я сонный и еще не курил))


Anatoly Podgoretsky   (2006-10-17 09:56:00) [3]

Тяжело учиться в кулинарном техникуме


Gydvin   (2006-10-17 08:06:00) [4]

А как же )))


Loginov Dmitry   (2006-10-17 08:01:00) [5]

Gydvin ©   (17.10.06 7:54) [15]


Ну да. TStringList юзать никак нельзя, а TFileStream - самое то! %))


Gydvin   (2006-10-17 07:54:00) [6]

Как тут уже говорили с пушки по воробьям, но .......

{Спер}

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('Толковый словарь испорчен!' + #13#10 + ' Переустановите приложение.');
     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;


funky   (2006-10-17 01:31:00) [7]


>  i:=i-1; {Что такое i?}
> ReadLn(CFile,s); {Зачем это?}

1. это для др. ф-ций
2. ну я так понял, что допустим мне нужна 3я строчка, первые 2 я пропускаю while, а третью так заношу o.O

Loginov Dmitry ©   (16.10.06 20:02) [12]
Вариант отличный, но я к сожалению действительно не могу использовать что-то для считывание текста помимо того, что я написал.

P.S. Спасибо всем кто помог, я действительно много подчеркнул из ваших советов скрип...(тьфу бл*) прога заработала. ;)


ProgRAMmer Dimonych   (2006-10-17 00:03:00) [8]

> Loginov Dmitry ©   (16.10.06 20:02) [12]
На этот вопрос ответа ещё не поступало :)


Loginov Dmitry   (2006-10-16 20:02:00) [9]

А чем собсвенно такой вариант не устраивает:

with TStringList.Create do
try
 LoadFromFile('FileName');
 if Count > textcount then
   S := Strings[textcount]
 else
   S := '';
finally
 Free;
end;


ProgRAMmer Dimonych   (2006-10-16 19:16:00) [10]

> [10]
Блин, вроде ж читал где-то. Приснилось, наверное...


Ketmar   (2006-10-16 19:12:00) [11]

>[9] ProgRAMmer Dimonych(c) 16-Oct-2006, 19:11
>А функции - они работают быстрее, чем процедуры...
хихик. скажи, что пошутил, не позорься.


ProgRAMmer Dimonych   (2006-10-16 19:11:00) [12]

P.S. И вообще я в [7] чё-то серьёзно напорол.

А функции - они работают быстрее, чем процедуры...


ProgRAMmer Dimonych   (2006-10-16 19:10:00) [13]

Да, по поводу замечания Ketmar'а:

Function ReadString(TextCount:Integer; var S:ANSIString):Cardinal;
begin
Result:=0;
for TextCNTi:=1 to TextCount do
begin
 if EOF(CFile) then
 begin
  S:=''; Result:=1; Exit;
 end;
 ReadLn(CFile,S);
end;
end;


ProgRAMmer Dimonych   (2006-10-16 19:08:00) [14]

Дискриминация по отношению к СтрингЛисту или нежелание использовать дополнительные модули?

textCNTi:=0;
while not(textCNTi=textcount) do
begin
inc(textCNTi);
ReadLn(CFile,s);
if EOF(CFile) then
begin
 i:=i-1; {Что такое i?}
 instext:=0;
 exit;
end;
end;
ReadLn(CFile,s); {Зачем это?}

Вариант 2:

Function ReadString(TextCount:Integer; var S:ANSIString):Cardinal;
for TextCNTi:=1 to TextCount do
begin
 Result:=0;
 ReadLn(CFile,S);
 if EOF(CFile) then
 begin
  S:=''; Result:=1; Exit;
 end;
end;
end;


Ketmar   (2006-10-16 19:06:00) [15]

>[3] funky 16-Oct-2006, 18:53
>а что тут не так?
всё.
для начала: подсовываем пустой файл. что должна прочитать первая ReadLn?
что за фигня "instext", и почему нигде не используется?
что прочитает последний ReadLn, если файл уже закончился?
вердикт: подумать. переписать. хинты я дал. если в такомпросить готовый код, то лучше в магазин хозтоваров. да-да, именно за ней -- за метлой.


funky   (2006-10-16 19:02:00) [16]

ProgRAMmer Dimonych ©   (16.10.06 18:55) [4]
не желательно я бы и сам с удавольствием, но... =(
лучше всего readln и аналоги


ProgRAMmer Dimonych   (2006-10-16 18:55:00) [17]

TStringList?


funky   (2006-10-16 18:53:00) [18]

ProgRAMmer Dimonych ©   (16.10.06 18:46) [2]
это делфи. но мемо и лист бокс использовать - не желательно %)

Ketmar ©   (16.10.06 18:44) [1]
а что тут не так? вроде бы нормально.
можно конечно написать while proxyCNTi < proxycount do
хотя хз. вам виднее.


ProgRAMmer Dimonych   (2006-10-16 18:46:00) [19]

Это в Turbo Pascal или в Delphi?


Ketmar   (2006-10-16 18:44:00) [20]

ай, какой красивый бред. тут не править надо, а полностью переписывать...


Наверх

Титульная страница Поиск, карта сайта Написать письмо