Форум: "Начинающим";
Текущий архив: 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.091 c