Usando HB_FUSE()

Foto de Anderson

Categoria: 

Eu já tive problemas com MEMOREAD/MEMOLINE para extrair informações de cada linha porque sempre tinha alguma coisa do além no início da primeira linha ou no final que atrapalhava tudo, então dependendo do caso eu tinha que criar linhas de tamanho fixo para tentar contornar a coisa.

Quando descobrí o HB_FUSE() a coisa ficou mais simples porque ele abre o arquivo como se fosse um DBF e extrai as linhas direitinho sem erro. Essa função não é nativa do Clipper, veio com o [x]Harbour.

Funções da mesma família:

  • HB_FAtEOF()
  • HB_FEof()
  • HB_FGoBottom()
  • HB_FGoto()
  • HB_FGoTop()
  • HB_FInfo()
  • HB_FLastRec()
  • HB_FReadAndSkip()
  • HB_FreadLN()
  • HB_FRecno()
  • HB_FSelect()
  • HB_FSkip()

Como nem tudo na vida é perfeito, há boatos de que o HB_FEof() sempre retorna .T., mas que o HB_FAtEOF() funciona como esperado. Enfim, já mudei minha estratégia e estou saindo pela tangente com FOR...NEXT usando HB_FLASTREC().

cFILENAME := "teste.txt"
nHANDLE := HB_FUse( cFILENAME )  
IF nHANDLE>0
	FOR X=1 TO HB_FLastRec()
         ? HB_FReadLn()
         HB_FSkip()
    NEXT
    HB_FUse()              
ELSE
	ALERT("Erro ao abrir arquivo")
ENDIF  

Ou mais simples: 

HB_FUse( "teste.txt" )  
FOR X=1 TO HB_FLastRec()
	? HB_FReadAndSkip()
NEXT
HB_FUse()              

Como ainda nem tudo são flores, ontem aconteceu de eu abrir um arquivo de texto com CR+LN como fim de linha e mesmo assim deu errado, não leu linha a linha certinho, mas leu o arquivo todo como se fosse uma linha só com "/n" entre elas. Eu sei porque abrí com o Notepad++ e fui em VISUALIZAR>MOSTRAR SÍMBOLO>EXIBIR FINAL DE LINHA.

Desta feita, resolví criar um arquivo de texto com FCREATE() dando CHR(13)+CHR(10) e fui depurando com debug para observar. Ví que a primeira linha ficou com "/r/n" no final, ou seja, o CHR(13) virou "/r" e o CHR(10) virou "/n". Portanto, havia algo errado só com o "/n" entre as linhas.

A partir da gravação da segunda linha em diante desapareceu o "/r/n" e mostrou a linha certinho. Ao dar um HB_FLastRec() mostrou a quantidade certa de linhas apesar de abrindo o arquivo tinha uma linha em branco entre as linhas e pude observar um CHR(13) no final de cada linha e depois um CHR(13)+CHR(10) no início da linha em branco apesar de eu não ter programado assim. 

O código de criação foi esse:

#include "FileIO.ch"
dTRYAL    := DATE()+9  
cLICENCAS := cSERIAL+";00;"+DTOC(dTRYAL)+CHR(13)+CHR(10)
// CRIA ARQUIVO
cFILENAME := "teste.txt"
IF (nRWOPEN := FCREATE(cFILENAME)) = -1
	ALERT("ERRO: "+ALLTRIM( STR( FERROR() )))
	QUIT
ENDIF
// GRAVA NOVA LINHA NO FIM DO ARQUIVO
nBOTTOM := FSeek( nRWOPEN, 0, FS_END )
FWRITE(nRWOPEN, cLICENCAS)
FClose( nRWOPEN )

E, se o arquivo já existir, abre e grava mais uma linha assim:

#include "FileIO.ch"
dTRYAL    := DATE()+9  
cLICENCAS := cSERIAL+";00;"+DTOC(dTRYAL)+CHR(13)+CHR(10) 
// GRAVA LICENÇA NO ARQUIVO
cFILENAME := "teste.txt"
nRWOPEN := FOPEN(cFILENAME, FO_READWRITE)
nBOTTOM := FSeek( nRWOPEN, 0, FS_END )
FWRITE(nRWOPEN, cLICENCAS)
FClose( nRWOPEN )

Rodando a rotina 3 vezes criou um arquivo de texto com 6 linhas:

arquivo texto resultante

Entretanto, o HB_FLastRec() contou 3 linhas e não 6. No final deu tudo certo, leu direitinho linha a linha!

Total votes: 0