Como saber a quantidade de linhas de um arquivo texto?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Como saber a quantidade de linhas de um arquivo texto?

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
MARINI
Usuário Nível 3
Usuário Nível 3
Mensagens: 288
Registrado em: 06 Jul 2004 08:06
Localização: Pindamonhangaba SP

Mensagem 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
Sds
Marini
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder