Linguagem de programação I A
description
Transcript of Linguagem de programação I A
Linguagem de programação I A
Carlos Oberdan Rolim
Ciência da ComputaçãoSistemas de Informação
Linguagem de programação I A
Carlos Oberdan Rolim
Ciência da ComputaçãoSistemas de Informação
Versão: 030714_01
Arquivos
Arquivos
Tipos de arquivo:
Sequencial (texto)
Caracteres armazenadas sequencialmente.
É possível determinar o primeiro, segundo terceiro .. caracteres que compõem o arquivo
Binário
Formado por uma sequência de bytes sem correspondência com um tipo de dado.
Cabe ao programador fazer esta correspondência quando lê e escreve estes arquivos.
Como trabalhar com arquivos
Antes de acessar os dados dentro de um arquivo é necessário abri-lo.
Executa-se as operações desejadas com o arquivos usando funções específicas para leitura e escrita
Ao terminar de realizar as operações no arquivo, devemos fechá-lo.
As operações de abertura e fechamento garantem a integridade dos dados.
As funções referentes a arquivos requerem a inclusão do stdio.h, e todo arquivo aberto é referenciado por um ponteiro para o tipo FILE.
Descritor de ArquivosDescritor de arquivo:
Em C: Estrutura de dados denominada FILE
Aponta para um arquivo físico no disco
O arquivo lógico e armazenado em variáveis de memória definidas pelo programador.
Todas operações feitas pelo descritor refletem no arquivo
Criando um descritor:
FILE *parquivo;
Arquivo “lógico”em memória
Descritor de Arquivo (FILE)Arquivo
“Físico”
Disco
Memória
Abrindo arquivos
A função “fopen” tem duas finalidades:
- abrir uma descritor de bytes
- ligar um arquivo em disco àquele descritor
FILE *fopen(char *NomeArquivo, char *modo);
FILE *arquivo;
if ((arquivo = fopen(“teste”,”w”)) == NULL) {
puts(“Não posso abrir o Arquivo teste.\n”);
exit(1); /* força o término da execução da rotina */
}
Abrindo arquivos
Outro exemplo
FILE *parquivo;
char *nome = "texto.txt";
if (( parquivo = fopen(nome, "w+b")) == NULL) {
printf("\n\nNao foi possivel abrir o arquivo para escrita.\n");
exit(1);
}
Modo Significado
“r” Abre Arquivo de Texto para Leitura
“w” Cria Arquivo de Texto para Gravação
“a” Anexa a um Arquivo de Texto
“rb” Abre Arquivo Binário para Leitura
“wb” Cria Arquivo Binário para Gravação
“ab” Anexa a um Arquivo Binário
“r+” Abre Arquivo de Texto para Leitura/Gravação
“w+” Cria Arquivo de Texto para Leitura/Gravação
“a+” Abre ou Cria Arquivo de Texto para Leitura/Gravação
“r+b” Abre Arquivo Binário para Leitura/Gravação
“w+b” Cria Arquivo Binário para Leitura/Gravação
“a+b” Abre ou Cria Arquivo Binário para Leitura/Gravação
Fechando arquivo
Fechando um arquivo: função fclose(..)
Quando um programa não precisa mais utilizar um arquivo por um período de tempo longo, o arquivo pode ser fechado
Fechar um arquivo protege os seus dados, garante que atualizações feitas serão salvas e libera o arquivo para outros usuários ou programas poderem utiliza-lo.
int fclose(FILE *fp);
fclose(arquivo);
C provê funções para ler caracteres, linhas de texto, padrões formatados ou
vetores de bytes:
int getc(FILE *arquivo);
lê um caracter do arquivo e retorna seu valor como inteiro. Retorna EOF
em caso de erro
int fgetc(FILE *f)
lê um byte, retorna seu valor (0-255) como inteiro. Retorna EOF em caso de
erro.
char *fgets(char *dest, int limite, FILE *f);
lê uma linha de texto (ou até atingir o limite de bytes lidos) e guarda o texto
lido em dest. Retorna dest em caso de sucesso, NULL em caso de erro.
int fscanf(FILE *f, char *formato, ...);
scanf para arquivos.
int fread(void *dados, int tam_elem, int num_elem, FILE *f);
lê num_elem elementos de tam_elem bytes cada e armazena em dados.
Retorna o número de elementos lidos com sucesso.
Leitura de dados
#include <stdio.h>
#include <conio.h>
int main() {
FILE * fp;
char ch;
fp = fopen ("arquivo.txt" , "r");
if (fp == NULL)
perror ("Erro abrindo arquivo");
else {
ch = getc(fp);
while (ch != EOF){
ch = getc(fp);
putchar (ch);
}
fclose (fp);
}
return 0;
}
Exemplo de código para ler e imprimir usando getc
#include <stdio.h>
int main() {
FILE * pFile; char mystring [100];
pFile = fopen (“arquivo.txt" , "r"); if (pFile == NULL) perror ("Erro abrindo arquivo"); else { fgets (mystring , 100 , pFile); puts (mystring); fclose (pFile); } return 0; }
Exemplo de código para ler e imprimir usando fgets
C provê funções para escrever caracteres, strings, padrões formatados ou
vetores de bytes:
int putc(int c, FILE *f)
Escreve o caracter c. Retorna EOF em caso de erro.
int fputc(int c, FILE *f)
Escreve o byte c. Retorna EOF em caso de erro.
int fputs(char *dest, FILE *f);
Escreve a string dest (que deve ter o zero terminador) no arquivo. Retorna EOF em caso
de erro.
int fprintf(FILE *f, char *formato, ...);
printf para arquivos.
int fwrite(void *dados, int tam_elem, int num_elem, FILE *f);
Escreve num_elem elementos de tam_elem bytes cada, armazenados em dados.
Retorna o número de elementos escritos com sucesso.
Escrita de dados
main(){FILE *arq;char ch; if ((arq=fopen(“teste.dat”,”w”)) == NULL) { printf(“Arquivo não pode ser criado\n”); exit(1); }
do{ch=getchar();putc(ch,arq);
}while (ch!=0);
fclose(arq);}
Escreve cada caracter lido em um arquivo usando putc
#include <stdio.h>
int main () {
FILE * pFile;
char str [256];
printf (“Informe string a gravar em arquivo: ");
fgets (str,255,stdin);
pFile = fopen (“arquivo.txt","a");
fputs (str, pFile);
fclose (pFile);
return 0; }
Escreve uma string lida em um arquivo usando fputs
fwrite ( ) e fread ( )
Permitem escrever e ler blocos de dados, sua forma
geral é a seguinte:
int fread(void *buffer, int num_bytes, int cont,
FILE *fp);
int fwrite(void *buffer, int num_bytes, int cont,
FILE *fp);
#include <stdio.h>int main() {FILE *pf;float pi = 3.1415;float pilido;if((pf = fopen("arquivo.bin", "wb")) == NULL) { printf("Erro na abertura do arquivo"); 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 para nova leitura */ printf("Erro na abertura do arquivo"); exit(1);}if(fread(&pilido, sizeof(float), 1,pf) != 1) /* Le 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);return(0);} Exemplo usando fwrite e fread
Erros com arquivos
A função ferror() determina se a operação de arquivo
produziu um erro. Sua forma geral será:
int ferror(FILE *fp);
#include <stdio.h> int main () { FILE * pFile; pFile=fopen(“arquivo.txt","r"); if (pFile==NULL) perror ("Erro ao abrir arquivo"); else { fputc ('x',pFile); if (ferror (pFile)) printf ("Erro na escrita ao arquivo\n"); fclose (pFile); } return 0; }
Em todo arquivo aberto há um "cursor" indicando a posição onde ocorrerá
a próxima leitura e/ou escrita. Todas as operações de leitura e escrita
avançam o cursor após ler/escrever os dados. Para mover o cursor, ou
obter sua posição atual, temos:
int fseek(FILE *f, long distancia, int origem);
Move o cursor do arquivo f para a posição distancia relativa em bytes a alguma origem.
A origem deve ser uma destas 3 constantes:
SEEK_SET – início do arquivo
SEEK_CUR – posição atual
SEEK_END – fim do arquivo
fseek retorna 0 em caso de sucesso, -1 em caso de erro.
Obs: Normalmente é utilizado em arquivos binários
long rewind(FILE *f);
Move o cursor para o inicio do arquivo.
long ftell(FILE *f);
Retorna a posição atual do cursor no arquivo f.
Posicionamento do cursor
main(){
FILE *fp;
char c;
if ((fp=fopen(“teste”,”rb”)) == NULL) {
printf(“Arquivo não pode ser aberto\n”);
exit(1);
}
fseek(fp,234L,0); /* L força que seja um inteiro longo */
c = getc(fp); /* lê o caracter 234 */
putchar(c);
}
Lê um caracter do arquivo binário
Obter o tamanho de um arquivo
int main () { FILE * pFile; long lSize;
pFile = fopen ( "myfile.bin" , "rb" ); if (pFile==NULL) { fputs ("File error",stderr); exit (1); } fseek (pFile , 0 , SEEK_END); /* vai para fim do arquivo */ lSize = ftell (pFile); /* retorna posicao atual */ rewind (pFile); /* volta para inicio */
printf(“Tamanho do arquivo em bytes%lf”, lSize);
}
#include “stdio.h”int main(int argc,char *argv[]) {FILE *in, *out;char ch;if (arg != 3) {
printf(“Digite o Nome dos Arquivos\n”);exit(1);}
if ((in=fopen(argv[1],”rb”)) == NULL) {printf(“Arquivo origem não existe\n”);exit(1);}
if ((out=fopen(argv[2],”wb”)) == NULL) {printf(“Arquivo destino não existe\n”);exit(1);}
while (! feof(in)) putc(getc(in),out); /* esta é a cópia propriamente dita */
fclose(in);fclose(out);}
Programa para copiar arquivos