Unidade F - Manipulação de Arquivos

Entrada/Saída padrão

O ponteiro do arquivo

Para trabalharmos com arquivos utilizamos a variável ponteiro do tipo FILE. O comando deve ser utilizado da seguinte forma:

FILE *fp;

Abrindo um arquivo

FILE  *fopen(char *nomearq, char *modo_abertura)

Onde:
<nomearq> é um ponteiro para o nome de um arquivo.
<modo_abertura> determina como o arquivo será aberto.

A string modo_abertura pode conter alguns dos seguintes caracteres:

Modo

Significado

r

Abre um arquivo-texto para leitura.

w

Cria um arquivo-texto para escrita.

a

Anexa a um arquivo-texto.

rb

Abre um arquivo-binário para leitura.

wb

Cria um arquivo-binário para escrita.

ab

Anexa a um arquivo binário.

r+

Abre um arquivo-texto para leitura/escrita.

w+

Cria um arquivo-texto para leitura/escrita.

a+

Anexa ou cria um arquivo-texto para leitura/escrita.

r+b

Abre um arquivo binário para leitura/escrita.

w+b

Cria um arquivo binário para leitura/escrita.

a+b

Anexa um arquivo binário para leitura/escrita.

FILE *fp;
if(fopen(“teste”,”w”)==NULL)
{          printf(“Arquivo nao pode ser aberto\n”);
                    exit(1);

}

Fechando um arquivo

int fclose(FILE *arquivo)
Fecha um arquivo. Retorna 0 se OK, qualquer outro valor indica erro.
fclose(arquivo);

Escrevendo um caractere

int fputc(FILE *arquivo)
Escreve um caracter no arquivo. Retorna o caracter lido ou EOF em caso de erro ou final de arquivo.
if (fputc(‘x’,arq)==EOF)
       printf(“Nao foi possivel gravar”);

Lendo um caractere

int fgetc(FILE *arquivo)

Lê um caracter do arquivo. Retorna o caracter lido ou EOF em caso de erro ou final de arquivo. A seguir, um exemplo que utiliza os comandos fopen, fgetc e fclose.

#include<stdio.h>
#include<stdlib.h>
int main()
{   
    FILE *fp;
    int c;
   if((fp=fopen("teste.txt","rt"))==NULL)
    {
        printf("O arquivo nao pode ser aberto");
        system("Pause");
        exit(1);
    }   
    do{//lê cada caracter do arquivo e imprime
        c=fgetc(fp);
        if (c==EOF) //se é final de arquivo
                    break;
        printf("%c",c);
     }   
     while(1);
     fclose(fp);
     system("Pause");

  }

Usando feof()

int feof(FILE *fp)

Retorna verdadeiro se o final de arquivo foi atingido; caso contrário, devolve 0.

Trabalhando com strings

int fputs(char *str, FILE *fp)

Escreve uma string em um arquivo, retorna o último caracter gravado ou EOF em caso de erro.

char *fgets(char *str, int tamanho, FILE *fp)

Lê uma linha de texto do arquivo, retorna um ponteiro para a string lida ou NULL em caso de erro ou final de arquivo.

Usando Rewind

void rewind(FILE *fp)
O ponteiro é apontado para o início do arquivo, é como se o arquivo fosse rebobinado.  

Usando fputs, fgets, rewind e feof

O exemplo a seguir lê strings do teclado até ser pressionada a tecla enter, em seguida as grava no arquivo e mostra o conteúdo do arquivo.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{   
    FILE *fp;
    char s[100];
    if((fp=fopen("teste.txt","w+"))==NULL)
    {   printf("O arquivo nao pode ser aberto");
        system("Pause");
        exit(1);
    }   
    do{
        printf("Digite uma string (enter para sair)!\n");
        gets(s);
        strcat(s,"\n"); //adiciona uma nova linha a string
        fputs(s,fp) ; //coloca a string no arquivo
      }   
     while(*s!='\n');
     rewind(fp);
     while(!feof(fp)) //testa se não é final de arquivo
     {
         fgets(s,99,fp); //pega a string do arquivo
         printf("%s",s);
     }
     fclose(fp);
     system("Pause");
     return 0;

}

Apagando Arquivos

int remove(char *filename)
Apaga o arquivo especificado. Ele devolve 0, caso consiga, e um valor diferente de 0, caso contrário.

O exemplo tenta apagar o arquivo “teste.txt”, caso consiga imprime mensagem mostrando o fato:

#include<stdio.h>
#include<stdlib.h>
int main()
{   
       if(remove("teste.txt"))
        {
            printf("O arquivo nao pode ser apagado!\n");
            system("Pause");                        
            exit(1);
        }
      else
         printf("Arquivo apagado!\n");
          
       
     system("Pause");
     return 0;

}

Usando fread() e fwrite()

Essas funções permitem a leitura e escrita de blocos de qualquer tipo de dado. Elas são utilizadas quando trabalhamos com arquivos binários.

A função fread devolve o número de itens lidos (não o número de bytes).

size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp)

onde:

<buffer>: Ponteiro para uma região da memória, geralmente uma estrutura ou um vetor, onde serão armazenados os dados lidos do arquivo.
<num_bytes>: Número de bytes a ler. Geralmente sizeof(buffer).
<count>: Número de itens a ler. Geralmente 1.
<fp>: Ponteiro FILE para um arquivo aberto anteriormente por fopen().

A função fwrite devolve o número de itens gravados.

size_t fwrite (void *buffer, size_t num_bytes, size_t count, FILE *fp)

onde:

<buffer>: Ponteiro para uma região da memória, geralmente uma estrutura ou um vetor, onde estão armazenados os dados a serem escritos no arquivo.
<num_bytes>: Número de bytes a escrever. Geralmente sizeof(buffer).
<count>: Número de itens a escrever. Geralmente 1.
<fp>: Ponteiro FILE para um arquivo aberto anteriormente por fopen().

Exemplo da utilização do fread e fwrite:

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *pf;
float pi = 3.1415;
float pilido;
if((pf = fopen("arquivo.bin", "wb")) == NULL) /* Abre arquivo binário para escrita */
{
    printf("Erro na abertura do arquivo");
    system("Pause");       
    exit(1);
}
if(fwrite(&pi, sizeof(float), 1,pf) != 1)     /* Escreve a variável pi */
    printf("Erro na escrita do arquivo");
fclose(pf);                                    /* Fecha o arquivo */
if((pf = fopen("arquivo.bin", "rb")) == NULL) /* Abre o arquivo novamente para leitura */
{
    printf("Erro na abertura do arquivo");
    system("Pause");       
    exit(1);
}
if(fread(&pilido, sizeof(float), 1,pf) != 1)  /* Lê em pilido o valor da variável armazenada anteriormente */
    printf("Erro na leitura do arquivo");
printf("\nO valor de PI, lido do arquivo e': %f", pilido);

fclose(pf);
system("Pause");
return(0);
}

Referênicas

SCHILDT, Herbert. C, completo e total. São Paulo: Pearson Makron Books, 1997.