Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

считывание опред. строки   Найти похожие ветки 

 
funky   (2006-10-16 18:39) [0]

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

<...>
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, тогда выход.


 
Ketmar ©   (2006-10-16 18:44) [1]

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


 
ProgRAMmer Dimonych ©   (2006-10-16 18:46) [2]

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


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

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:55) [4]

TStringList?


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

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


 
Ketmar ©   (2006-10-16 19:06) [6]

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


 
ProgRAMmer Dimonych ©   (2006-10-16 19:08) [7]

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

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;


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

Да, по поводу замечания 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:11) [9]

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

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


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

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


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

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


 
Loginov Dmitry ©   (2006-10-16 20:02) [12]

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

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


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

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


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


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

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

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

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


 
Gydvin ©   (2006-10-17 07:54) [15]

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

{Спер}

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;


 
Loginov Dmitry ©   (2006-10-17 08:01) [16]

Gydvin ©   (17.10.06 7:54) [15]


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


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

А как же )))


 
Anatoly Podgoretsky ©   (2006-10-17 09:56) [18]

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


 
Орион ©   (2006-10-17 10:03) [19]

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

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


 
Орион ©   (2006-10-17 10:04) [20]

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

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 :)



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.055 c
2-1160998430
Phoroon~
2006-10-16 15:33
2006.10.29
Количество иконок


2-1160631958
Sergey_b
2006-10-12 09:45
2006.10.29
DLL


11-1136150719
Arberes
2006-01-02 00:25
2006.10.29
Ошибки....


11-1137023812
-=Mike=-
2006-01-12 02:56
2006.10.29
Нужно реализовать следующий функционал для инкрементного поиска


2-1160726463
Dmitry_177
2006-10-13 12:01
2006.10.29
Проблема с CreateFileMapping