Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.05 c
2-1161003880
evgenij_
2006-10-16 17:04
2006.10.29
Создать Label


2-1160998430
Phoroon~
2006-10-16 15:33
2006.10.29
Количество иконок


2-1160535831
Фесс
2006-10-11 07:03
2006.10.29
Сократить две числовые строки


15-1159915299
Multy
2006-10-04 02:41
2006.10.29
Ну и что это за уродство?


2-1160544824
gvozdkoff
2006-10-11 09:33
2006.10.29
Ключевре поле DB Paradox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский