Página 1 de 1

Como saber a quantidade de linhas de um arquivo texto?

Enviado: 22 Abr 2008 23:18
por clodoaldomonteiro
Olá !

Tenho um visualizador de arquivos textos, para visualizar os relatórios em vídeo, e to querendo mostrar a linha atual e a quantidade de total de linha.

O arquivo é aberto pelo fopen(), que retorna, eu acho a quantidade de caracteres.

Na verdade eu queria mostrar uma barra na direita rolando do ínicio até o final do arquivo.

Desde já agradeço as dicas.

Enviado: 23 Abr 2008 06:28
por Maligno
Contar linhas significa contar os pares CR/LF. Seria algo como:

Código: Selecionar todos

function LinesCount(nFileH)

#define _EOL        Chr(13)+Chr(10)
#define _BUFFER_LEN 4*1024

local cBuffer := Space(_BUFFER_LEN)
local nLines  := 0
local cRead   := ""
local i
local n

while (n := FRead(nFileH,@cBuffer,_BUFFER_LEN)) > 0
   cRead += Left(cBuffer,n)
   while (i := At(_EOL,cRead)) > 0
      nLines++
      cRead := SubStr(cRead,i+Len(_EOL))
   end
   cBuffer := Space(_BUFFER_LEN)
end
return nLines
Recortei esse código do meu sub-sistema de manipulação de texto e adaptei, removendo as partes não essenciais. Portanto, não sei se funciona corretamente. Acredito que sim. Mas dá pra ter uma idéia de como é.

Neste exemplo, repare que o ponteiro do arquivo não é salvo. Ao final, ele estará no fim do arquivo. Logo, você terá de restaurar o ponteiro para poder voltar a usá-lo normalmente.

Enviado: 23 Abr 2008 10:19
por MARINI
Outra forma seria usar:

texto=MEMOREAD(nomearq)
for i:=1 TO MLCOUNT(texto)
?? i // linha
?? memoline(.....) // texto da linha
next

http://www.itlnet.net/programming/progr ... 6efc7.html
http://www.itlnet.net/programming/progr ... 7311a.html
http://www.itlnet.net/programming/progr ... 6e303.html

Enviado: 23 Abr 2008 10:51
por clodoaldomonteiro
Maligno, valeu a dica, ficou primeira.

Acrescentei um contador de linha para ser mostrado ao usuário a cada toque nas setas e nas teclas pgup ou pgdn.

Assim mostro no rodapé da visualização o seguinte: "Linha: 0001/0350" e toda vez que o usuário rolar a tela o primeiro numero vai sendo incrementa ou decrementado e o último número fica estático, já que ele é o total linhas da função que você meu deu.

Muito obrigado mesmo.

Marini,
Não posso usar o memoread() pois os textos abertos podem ultrapassar o limite de uma MEMO, ainda assim agradeço a dica.

Enviado: 23 Abr 2008 11:43
por Maligno
Que bom que funcionou. Acho que só faltou mesmo salvar o ponteiro do arquivo para tornar a função genérica. Não é algo essencial, mas ainda assim, incrementei:

Código: Selecionar todos

#define _EOL        Chr(13)+Chr(10)
#define _BUFFER_LEN 4*1024

//-------------------------------------------------
function LinesCount(nFileH)
local cBuffer := Space(_BUFFER_LEN)
local nFileP  := FSeek(nFileH,0,1)
local nLines  := 0
local cRead   := ""
local i
local n
*
FSeek(nFileH,0,0)
while (n := FRead(nFileH,@cBuffer,_BUFFER_LEN)) > 0
   cRead += Left(cBuffer,n)
   while (i := At(_EOL,cRead)) > 0
      nLines++
      cRead := SubStr(cRead,i+Len(_EOL))
   end
   cBuffer := Space(_BUFFER_LEN)
end
FSeek(nFileH,nFileH,0)
return nLines