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.
Como saber a quantidade de linhas de um arquivo texto?
Moderador: Moderadores
- clodoaldomonteiro
- 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?
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
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Contar linhas significa contar os pares CR/LF. Seria algo como:
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.
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 nLinesNeste 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!
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

- Mensagens: 288
- Registrado em: 06 Jul 2004 08:06
- Localização: Pindamonhangaba SP
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
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
Marini
- clodoaldomonteiro
- Usuário Nível 4

- Mensagens: 821
- Registrado em: 30 Dez 2006 13:17
- Localização: Teresina-PI
- Contato:
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.
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
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
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!
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!
