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