Jump to content

Recommended Posts

Posted

O que vou aqui explicar é o básico para trabalhar com ficheiros em VB6.

  • Ler/Escrever em ficheiros de texto
  • Ler/Escrever em ficheiros binários
  • Apagar Ficheiros
  • Renomear Ficheiros
  • Verificar a Existência de um determinado Ficheiro

Ficheiros de Texto

Ler

Dim strFicheiro As String

Open "dir ficheiro" For Input As #1
   Line Input #1, strFicheiro
Close #1

"dir ficheiro" -> directório do ficheiro que se pretende abrir

For Input -> indica que vamos abrir o ficheiro apenas para leitura

#1 -> é como um identificador para o ficheiro

Line Input #1, strFicheiro -> carrega a informação para dentro da variável strFicheiro

Close #1 -> Ao abrir o ficheiro este fica a ser utilizado pelo programa e não é possível apaga-lo enquanto não for fechado no programa o ficheiro

O código a cima lê a primeira linha de um ficheiro de texto e carrega essa informação para a variável strFicheiro. A cada vez que se executa a linha Line Input #1, strFicheiro será lida a linha seguinte. Se quisermos ler apenas as 2 primeiras linhas de um ficheiro de texto podemos colocar duas linhas Line Input #1, strFicheiro seguidas:

Dim strFicheiro As String
Dim temp As String

Open "dir ficheiro" For Input As #1
   Line Input #1, temp
   strFicheiro = temp
   Line Input #1, temp
   strFicheiro = strFicheiro & temp
Close #1

Ao tentarmos ler uma linha inexistente ou seja, se no ficheiro de texto não existir mais linhas para ler e se tentarmos ler mais linhas irá dar erro. Não esquecer que uma linha em branco é diferente de uma linha inexistente.

Este método serve se quisermos apenas ler 1, 2 ou 3 linhas mas, se quisermos ler um ficheiro de texto completo com por exemplo 100 linhas não vamos repetir 100 vezes a mesma linha de código. Para contornar este problema utilizamos um ciclo while:

Open "dir ficheiro" For Input As #1
   While EOF(1)
       Line Input #1, temp
       strFicheiro = strFicheiro & temp
   Loop
Close #1

While EOF(1) -> inicio do ciclo while. EOF ou End Of File (em português "Fim Do Ficheiro") ou seja, repete o ciclo enquanto não chegar ao fim do ficheiro de texto. O 1(um) da linha EOF(1) não tem a função de indicar se a expressão é verdadeira ou falsa. Indica que o ciclo vai acabar quando chegar ao fim do ficheiro 1, porque abrimos o ficheiro com o marcador 1 (Open "dir ficheiro" For Input As #1). Não é obrigatório ser sempre utilizado o numero 1. Se quisermos ler 2 ficheiro e não os fechar imediatamente a seguir a termos lido a informação, teremos de mudar de marcador para os diferentes ficheiros. Se por exemplo não tivesse fechado o ficheiro com o marcador 1 e quisesse abrir outro ficheiro para ler ou escrever teria de utilizar outro marcador em vez do 1:

Open "dir ficheiro" For Input As #2
   Line Input #2, strFicheiro
Close #2

Quando falo em "não fechar um ficheiro" refiro-me a não utilizar a linha Close #2, e enquanto não a utilizar este ficheiro ira estar a a ser utilizado pelo programa. Isto serve para um ficheiro que é utilizado várias vezes durante a execução de um programa. Como é utilizado várias vezes, o ficheiro é aberto por exemplo no evento Form_Load e não mais é fechado ate o programa terminar. Isto evita que para ler ou escrever no ficheiro tenhamos que andar sempre a escrever todo aquele código. Assim se o ficheiro estiver aberto basta a linha Line Input #2, strFicheiro.

Escrever

Open "dir ficheiro" For Output As #1
   Print #1, strFicheiro
   'ou
   Write #1, strFicheiro
Close #1

For Output -> indica que vamos abrir um ficheiro para escrita

Print #1, strFicheiro -> Escreve no ficheiro de texto o que estiver na variável strFicheiro

Write #1, strFicheiro -> Escreve no ficheiro de texto o que estiver na variável strFicheiro, com a diferença de colocar entre aspas o que escreve. Imaginemos que a variável continha a string Frase Teste, esta string seria passada para o ficheiro de texto assim -> "Frase Teste"

O código acima serve para escrevermos num ficheiro de texto. Ao abrirmos o ficheiro com a linha Open "dir ficheiro" For Output As #1 ele criará o ficheiro caso ele não exista ou, caso exista o que estiver dentro dele será eliminado e ficará em branco.

Open "dir ficheiro" For Append As #1
   Print #1, strFicheiro
   'ou
   Write #1, strFicheiro
Close #1

Este código serve para escrever em ficheiro de texto como o anterior com a diferença de dar para adicionar texto a ficheiros já existentes e com informação. Com este código acrescenta-se no final do ficheiro a informação desejada. A nível de código a diferença esta no modo com que se abre o ficheiro (For Append)

Ficheiros Binários

Ler

Dim strFicheiro() As Byte
Dim iFreeFile As Long

iFreeFile = FreeFile

ReDim strFicheiro(tamanho_ficheiro)
Open "dir ficheiro" For Binary Access Read As #iFreeFile
   Get #iFreeFile, 1, strFicheiro
Close #iFreeFile

iFreeFile = FreeFile -> para ficheiro binários, antes de abrirmos o ficheiro temos de reservar espaço em memória para o armazenar

ReDim strFicheiro(5) -> redimensiona a variável com o tamanho do ficheiro a abrir

Get #iFreeFile, 1, strFicheiro -> coloca-se o conteúdo do ficheiro na variável strFicheiro. O "1" indica em que posição começar a ler o ficheiro.

Este metodo de ler ficheiro binários é mais utilizada para ser ter um maior controlo pois o programador pode escolher partes do ficheiro que queria carregar, em vez de carregar o ficheiro completo uma vez que define o tamanho da variável e o ponto de inicio de leitura.

Dim strFicheiro As String
Dim iFreeFile As Long

iFreeFile = FreeFile

Open "dir ficheiro" For Binary Access Read As #iFreeFile
   strFicheiro = Input(LOF(iFreeFile), iFreeFile)
Close #iFreeFile

strFicheiro = Input(LOF(iFreeFile), iFreeFile) -> carrega-se o ficheiro para a variável strFicheiro como tamanho que se desejar. LOF() ou Lenght Of File que significa comprimento/tamanho do ficheiro, essa função retorna o tamanho do ficheiro. Se por exemplo se quizer apenas carregar os primeiros 8 bytes do ficheiro troca-se LOF(iFreeFile) por 8 e seriam apenas os primeiros 8 bytes carregados para a variável strFicheiro.

Escrever

Dim strFicheiro As String
Dim iFreeFile As Long

iFreeFile = FreeFile

strFicheiro = "string teste"

Open "dir ficheiro" For Binary Access Write As #iFreeFile
   Put #iFreeFile, 1, strFicheiro
Close #iFreeFile

Com este código escreve-se para um ficheiro binário. O "1" indica onde se deve começar a escrever no ficheiro. Se por exemplo o programador colocar "1" como esta acima e se existir informação nesse ficheiro, essa informação será substituída, exemplo:

Antes: "1234567"

Escreve-se no ficheiro a string "teste" com a linha -> Put #iFreeFile, 1, strFicheiro

Depois: "teste67"

Se quiser inserir no fim do ficheiro basta trocar o numero por LOF(iFreeFile), ficando assim: Put #iFreeFile, LOF(iFreeFile), strFicheiro

Como por vezes é necessário ler e escrever para um ficheiro em simultâneo, não dá muito geito andar a abrir o ficheiro em modo de leitura, abrir o ficheiro em modo escrita e sempre assim... por isso pode-se fazer o seguinte:

Dim strFicheiro As String
Dim varLeitura() As Byte
Dim iFreeFile As Long

iFreeFile = FreeFile

strFicheiro = "string teste"

ReDim varLeitura(tamanho_ficheiro)

Open "dir ficheiro" For Binary As #iFreeFile
   Put #iFreeFile, 1, strFicheiro
   Get #iFreeFile, 1, varLeitura
Close #iFreeFile

Basta retirar Binary Access Write ou Binary Access Read, e assim pode-se ler e/ou escrever.

Apagar Ficheiros

Kill "dir ficheiro"

bem.. não ha muito a dizer sobre esta linha... quando se tenta apagar um ficheiro que não existe dá erro, portanto pode-se adicionar mais uma linha para evitar que dê erro e o consequente encerramento do processo:

On Error Resume Next
Kill "dir ficheiro"

Renomear Ficheiros

Name "nome_antigo" As "novo_nome"

Tal como a linha anterior caso o ficheiro não exista pode ocorrer erro, por isso será melhor adicionar mais uma linha para evitar problemas....

Verificar a Existência de um determinado Ficheiro

If Dir("dir ficheiro") = "nome_ficheiro" Then
   'Codigo aqui
End If

Para evitar os erros falados nas duas linha de código anteriores, podemos utilizar este código a acompanha-las em vez do On Error Resume Next. Na minha opinião é uma forma mais "proficional" de o fazer.

"dir ficheiro" será trocado pelo directório do ficheiro e o respectivo nome do ficheiro que se quer verificar a existência: "c:\teste.exe"

"nome_ficheiro" será trocado por exemplo por teste.exe. Caso o ficheiro não exista a função Dir() não irá retornar nenhum valor, caso exista retorna o nome do ficheiro.

NOTA

Na minha opinião quando se esta a trabalhar com ficheiros nunca se sabe o que pode acontecer ou o que os utilizadores fazem, por isso aconselho a utilizarem sempre nas funções onde estão a trabalhar com ficheiros, que coloquem a linha de código On Error Resume Next

E é tudo (pelo menos o que eu considero básico 😄 ). Alguma dúvida, já sabem.... não hesitem em perguntar 😉

Cumps

  • 2 months later...
Posted

Viva

Supondo que eu quero criar um ficheiro de texto onde vá escrever dados relativos a uma pessoa.

Esses dados estariam organizados por

numero  nome  telefone

cada um destes campo faz parte de uma estrutura.

Quando abro o ficheiro em Random, se usar o

Put #file, , estrutura

A formataçao dos dados é esquesita, pois entre cada campo da estrutura é colocado um quadrado.

Se abrir em Append posso imprimir campo a campo, mas um dos objectivos era verificar se o numero da pessoa já exisrte na linha.

Em suma.

se usar o random, há algumna maneira de imprimir os campos sem aquele quadrado e já agora é possivel percorrer o ficheirop á procura do numero?

obrigado e desculpem...

Posted

Boas.

Eu não sei a origem da informação que guardas no ficheiro de texto, mas normalmente esses "quadradinhos" aparecem onde seria para estar um parágrafo, o equivalente a um "Enter", não sei se é o caso.

Quando falas em Random, a que te referes?

e já agora é possivel percorrer o ficheirop á procura do numero?

Sim é 😉

Cumps

Posted

Open "c:\bb.txt" For Random As #2 'Len = Len(rt)
Put #2, , estrutura(1, 2)
Close #2

Estrutura:

Type tRec
Id As String
Channel As String
End Type

o resultado no ficheiro bb.txt é o seguinte

  [] 3  []Sensor

Os dois campos que mandei imprimir tem o conteudo correcto, mas o raio dos quadrados é que nao estao lá a fazer nada.

Tambem posso usar a abertura de ficheiro do tipo APPEND, mas aí nao consigo imprimir a estrutura toda de uma so vez e cada campo da estrutura fica numa linha diferente.

O que eu queria era que dada a estrutura a info ficasse da seguinte maneira no txt

Id__channel__[outra campos]

1      5              .....

6      7                .....

não sei como fazer para que a info fique formatada assim

Posted

Como já disse esses quadrados são devido a um paragrafo com um formato esquisito (não sei a razão). Então e se utilizares output em vez de Random? O ramdom nem sabia de exitir....

Atenção que ao abrires o ficheiro em modo output, o que esta no ficheiro desaparece....

Se queres que essa estrotura apareça em linha então tens de ver a origem dessa estrutura. Ele só por si não coloca esses parágrafos.

Cumps

  • 5 months later...
  • 2 months later...
Posted

Ola é o seguinte, tenho um ficheiro  .txt ja com informaçao dentro dele, e ao mandar escrever mais informaçao ele vai subestituir as linhas, e perder a informaçao antiga..

ou seja eu preciso mesmo saber é como posso dizer para ele por exemplo começar a escrever na linha 4, em vez de começar a escrever no inicio, como pulo linhas sem as apagar?

Posted

E que tal ler o tutorial  😄

Open "dir ficheiro" For Append As #1

    Print #1, strFicheiro

    'ou

    Write #1, strFicheiro

Close #1

Este código serve para escrever em ficheiro de texto como o anterior com a diferença de dar para adicionar texto a ficheiros já existentes e com informação. Com este código acrescenta-se no final do ficheiro a informação desejada. A nível de código a diferença esta no modo com que se abre o ficheiro (For Append)

Cumps

  • 2 months later...
Posted


Open "c:\bb.txt" For Random As #2 'Len = Len(rt)
Put #2, , estrutura(1, 2)
Close #2

Para leres do ficheiro no formato correcto usas

Open "c:\bb.txt" For Random As #2 'Len = Len(rt)
get #2, , estrutura(1, 2) ' só tens de "dizer" que queres o get em vez do put 
Close #2
  • 5 years later...
Posted

E como fazer para não repetir os dados do arquivo em txt para que ele só seja exibido uma vez . EX: num arquivo em txt, tem 5 paginas e quero que exiba somente uma vez a data q aparece nas 5 páginas???

Open "C:\ABONO09.txt" For Input As #1

 Line Input #1, linha
 Do While Not EOF(1) 'ler até o final do arquivo
 If UCase(Mid(linha, 34, 11)) = "OCORRENCIAS" Then ' se na linha tiver a palavra ocorrencia então imprimi as data1 e data2
 data1 = Mid(linha, 60, 8)
 data2 = Mid(linha, 71, 8)
 Print "Data: "; data1; " "; "à" & " "; data2; vbCrLf ' o caracter "&" substitui o ";" e o vbcrlf pula uma linha
 End If

bjs hk

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.