Buscar

arquivos

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

*
*
*
Arquivos
Streams e Arquivos.
O sistema de E/S de C criou uma abstração entre o programador e o dispositivo que queremos utilizar. Essa abstração é chamada de STREAM.
O dispositivo real que queremos acessar chamamos de ARQUIVO.
Como o sistema de arquivos de C é projetado para trabalhar com uma grande variedade de dispositivos, foi criado a entidade STREAM que abstrai a funcionalidade de cada dispositivo associando as funções de Entrada e Saída de C.
Resumo  ARQUIVO é o dispositivo real que queremos trabalhar (Disco, Terminal, Fita, Teclado, Console). STREAM é a entidade que abstrai a funcionalidade do dispositivo real (ARQUIVO) e garante que as mesmas funções podem escrever em qualquer dispositivo real.
*
*
*
Arquivos
Ponteiro de Arquivo  é um ponteiro para informações que definem varias coisas sobre o arquivo, incluindo seu nome, status, posição atual.
Em suma, um ponteiro de arquivo identifica um arquivo específico em disco e é usado pela STREAM associada para direcionar operações de E/S.
DECLARAÇÃO 
FILE *arq;
Esta definido na STDIO.H
EOF (End Of File)  Flag usado pelo C para indicar fim de Arquivo
Cada vez que lemos ou escrevemos uma informação num arquivo o seu indicador de posição é incrementado.
A partir de agora estaremos sempre nos referindo a arquivos em disco !!
*
*
*
Arquivos
Abrindo arquivos :
FILE *fopen(const *char nomearq, const *char modo)
nomearq  ponteiro para uma cadeia de carcteres
Pode incluir também o caminho de pesquisa do arquivo (path)
modo  determina como o arquivo será aberto
*
*
*
Arquivos
Abrindo arquivos
fopen () devolve um ponteiro para o arquivo aberto. Nunca devemos alterar o valor desse ponteiro ! 
Quando ocorre um erro de abertura de arquivo fopen() devolve um ponteiro nulo
Exemplo:
FILE *arq;
if((arq = fopen(“teste”,”w”))==NULL) {
printf(“Erro de abertura !!\n”);
exit(-1);}
Nesse caso, abriremos o arquivo teste para escrita. Caso o arquivo não exista, ele será criado, caso ele jpa exista o seu conteúdo será destruído.
Fechando arquivos
int fclose (FILE *arq);
‘0’ indica que o arquivo foi fechado, qualquer outro valor indica que houve problemas
Fclose(arq);
*
*
*
Arquivos
Escrevendo caracteres
putc( ) e fputc( ) todas as duas funionam identicamente. Elas existem para preservar compatibilidade com as versões mais antigas de C
int putc (int ch, FILE *arq);
Por razões de compatibilidade o ch é definido como inteiro, porém somente o byte menos significativo é usado.
Caso ela seja bem sucedida, retornará o caractere escrito. Caso contrário devolve EOF (End Of File)
putc(‘a’,arq);
Lendo um caractere
getc( ) e fgetc( )  mesmo motivo de putc ( )
int getc(FILE *arq);
Devolve EOF quando o final de arquivo é alcançado.
do{
ch=getc(arq);
}while(ch!=EOF);
*
*
*
Arquivos
Primeira Prática:
Fazer um programa que que leia caracteres do teclado e os escreva num arquivo em disco até que o usuário digite o caractere $. O nome do arquivo deve ser especificado na linha de comando (passando parâmetro para o main). Usar função getche ( ) para ler do teclado.
Segunda Prática
Fazer um programa que leia qualquer arquivo texto e mostre seu conteúdo na tela. O nome do arquivo deve ser especificado na linha de comando do programa (passando parâmetro para o main).
*
*
*
Arquivos
feof( )
Função que determina quando um final de arquivo é encontrado.
Quando utilizamos um arquivo binário, podemos ler um valor inteiro igual a EOF. Para isso foi criada essa função.
int feof(FILE *arq);
Devolve verdadeiro caso o final do arquivo foi atingido, caso contrario devolve 0
while(!feof(arq)) ch=getc(arq);
*
*
*
Arquivos
Escrevendo Strings
fputs( ) Escreve uma string num arquivo texto
int fputs (const char *str, FILE *arq);
Opera como o putc( ), porém escreve uma string no arquivo especificado. Caso ocorra um erro ela devolve EOF
fputs(“Ola Mundo !!”,arq);
Lendo Strings
fgets( )  Lê uma string de um arquivo texto
char *fgets(char *str,int tamanho, FILE *arq);
Lê uma string de uma STREAM especificada até que um caractere de nova linha (“\n”)seja encontrado ou até que sejam lidos tamanho-1 caracteres. 
Se um caracter nova linha é lido, ele faz parte da string
Devolve um ponteiro para str se é bem sucedida, caso contrário devolve nulo.
char *str;
fgets(str,10,arq);
*
*
*
Arquivos
Funções de Suporte
rewind( )
Esta função reposiciona o indicador de posição de arquivo no início do arquivo.
void rewind (FILE *arq);
Se fazemos uma operação de escrita num arquivo e depois queremos ler o seu conteúdo do começo, podemos usar rewind ( ) para fazer com que o indicador de posição retorne ao começo do arquivo para que possamos fazer a leitura.
ferror( )  verifica se a operação com um arquivo produziu algum erro.
int ferror (FILE *arq);
Retorna verdadeiro se ocorreu um erro durante a última operação de arquivo, caso contrário retorna falso
*
*
*
Arquivos
Funções de Suporte
remove( )  apaga o arquivo especificado. 
int remove(char *nome_arquivo);
Retorna zero caso seja bem sucedido, caso contrário retorna um valor diferente de 0.
fflush ( )  esvazia o conteúdo de uma stream de saída.
int fflush(FILE *arq);
Devolve zero caso obtenha sucesso , caso contrário devolve EOF
*
*
*
Arquivos
fread ( ) e fwrite ( )
Lê e escreve no arquivo tipos de dados maiores que um byte.
size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *arq);
size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *arq);
Buffer  ponteiro p/ região de memória destino (fred) / origem (fwrite) dos dados
Num_bytes número de bytes a ler/escrever
Count  determina quantos itens (cada um do comprimento de num_byte) serão lidos/escritos
Arq  ponteiro para o arquivo
Fread ( ) devolve o número de itens lidos.
Fwrite ( ) devolve o número de itens escritos
*
*
*
Arquivos
fread ( ) e fwrite ( )
Void main (void){
FILE *arq;
double d = 12.23;
int i=101;
if(arq=fopen(“teste”,”wb+”))==NULL){
Printf(“erro”);
exit(-1);
fwrite(&d,sizeof(double),1,arq);
fwrite(&i,sizeof(int),1,arq);
rewind(arq);
fread(&d,sizeof(double),1,arq);
fread(&i,sizeof(int),1,arq);
printf(“%f %d”,d,i);
fclose(arq);
*
*
*
Arquivos
fread ( ) e fwrite ( )
Se temos uma matriz de reais do tipo 
Float mat[500][500];
E queremos escrever/ler num arquivo ?
Fwrite(mat,sizeof(float),500*500,arq);
Fread(mat,sizeof(float),500*500,arq);
Se temos uma estrutura do tipo 
Struct tipo{ 
Float media;
Char nome[30];
} reg_tipo;
E queremos escrever em arquivo ?
fwrite(&cust,sizeof(tipo),1,arq);
*
*
*
Arquivos
É importante ressaltar que o fwrite não formata alguns tipos de dados como texto. Ou seja se escrevemos um double, um int ou um float com fwrite, não será possível identifica-los usando um editor de textos.
Pratica 3
Fazer um programa que leia strings do teclado e escreva num arquivo texto, até que o usuário escreva uma linha em branco. Depois o programa deve ler o arquivo do começo e imprimir o seu conteúdo na tela.
Dica  concatenar o alimentador de linha ‘\n’ no final de cada string lida, antes de escrever no arquivo. Para que o arquivo possa ser lido mais facilmente. Usar feof ( ) para testar fim de arquivo.
*
*
*
Arquivos
fseek()
Função que nos permite efetuar acesso aleatório no arquivo. Ela manipula o indicador de posição do arquivo.
int fseek(FILE *arq, long numbytes, int origin)
arq  Ponteiro para o arquivo
numbytes  Deslocamento em bytes a partir da origem
origin  pode assumir o valor das seguintes macros
SEEK_SET  Inicio do arquivo
SEEK_CUR  Posição atual
SEEK_END  Final do arquivo
Esta função devolve um 0 quando é bem sucedida e um valor diferente de 0 caso contrário
fseek(arq,10,SEEK_SET);
Podemos nos movimentar usando múltiplos de qualquer tipo de dados
fseek(arq,9*sizeof(struct addr),SEEK_SET)
*
*
*
Arquivos
fseek()
void main (int argc, char *argv[]){
FILE *arq;
if(argc!=3`){
printf(“Uso correto: SEEK nomearq byte\n”);
exit(1);
}
if((arq=fopen(argv[1],”r”))==NULL){
printf(“Erro no arquivo”);
exit(0);
}
if(fseek(arq,atol(argv[2]),SEEK_SET)){
printf(“Erro na busca”);
exit(-1);
}
printf(“ O caractere do byte %ld é %c \n”,atol(argv[2]),getc(arq));
fclose(arq);
}
*
*
*
Arquivos
fprintf( ) e fscanf( )
Comportam-se exatamente como o printf() e o scanf( ), exceto por operarem com arquivos.
int fprintf(FILE *arq,const char *control_string,...)
int fscanf(FILE *arq,const char *control_string,...)
arq  ponteiro para arquivo
Essas funçoes direcionam suas operações de E/S para um arquivo
fprintf(arq,”%s”,string);
fscanf(arq,”%d”,&num);
Fprintf e fscanf talvez seja a maneira mais fácil de se escrever num arquivo. Pois elas escrevem qualquer tipo de dado num arquivo texto do mesmo modo que esses dados apareceriam na tela. Para isso elas usam marcas especiais no arquivo. Devido a essa características, elas são funções mais lentas que o fread e o frwrite por exemplo.
*
*
*
Arquivos
Pratica 4
Fazer um programa que armazene uma lista postal em arquivo. A lista contém os seguintes campos : 
Char Nome[30], rua[20],cidade[20]
Unsigned cep
Deveremos colocar um menu na tela com as seguintes opções.
1 – Entrar Endereço na lista
2 – Excluir Endereço da Lista
3 – Imprimir Lista
4 – Guardar em arquivo
5 – Ler lista do arquivo
6 – Sair
A lista deve poder armazenar no máximo 40 endereços.
Usar fread e fwrite
Pratica 5
Refazer a questão anterior usando fprintf, fscanf e fgets

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais