![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
считывание опред. строки
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]ай, какой красивый бред. тут не править надо, а полностью переписывать...