Sie sind auf Seite 1von 6

Roteiro

Reviso
1. Funes 2. Ponteiros 3. Registros

Arquivos, Entrada e Sada


AEDS 1 2008/2 Aula 22 Mirella M. Moro

Funes em C
tipo NomeDaFuncao (lista_de_parmetros) { comandos; return valor_retornado; }

Funes em C
int SomaDoisNumeros(int A, int B) { return A +B; } void ImprimeTexto() { printf(Ola Mundo); } int main() { int r; r= SomaDoisNumeros (30, 50); ImprimeTexto(); return 0; }
3 4

Funes: Passagem de parmetros


void FuncaoQualquer(int A, int* B) { A = 1; *B= 2; } main() { int X = 0, Y = 0; FuncaoQualquer (X, &Y); printf(%d %d, X, Y); system(pause); }
5

Ponteiros
int x=10, *p1, *p2; // x varivel do tipo inteiro // p1 e p2 so ponteiros para // variveis do tipo inteiro p1 = &x; //p1 recebe o endereo de x ( x) p2 = p1; //p2 recebe p1, tambm printf(%d, *p2); //escreve o valor de x printf(%d, p2); //escreve lixo printf(%p, p2); //escreve o endereo de x

Registros em C
struct RegFunc {
int Inscricao; char Nome[40], Rua[15]; int Numero; int CEP[8], CPF[11] char Sexo[3]; int DataNascimento[3]; bool FeriasVencidas ; int TempoDeCasa;

Accesso aos Dados


int main() { struct tresNum { int c1; float c2; float c3; }; tresNum tn; tn.c1 = 10; printf("Entre com o segundo valor\n"); scanf ("%f", &tn.c2); tn.c3 = tn.c1 * tn.c2; printf("Valores do registro = %d, %.2f, %.2f\n", tn.c1, tn.c2, tn.c3); system("pause"); }
7 8

Define um novo tipo composto, heterogneo Declara uma varivel do novo tipo

}; RegFunc Funcionario;

Inicializao de Dados
struct tipo_funcionario { int cod; char nome[30]; char cargo[10]; int depto; float salario; }; int main() { struct tipo_funcionario func = { 1432, "Jose Costa", "Gerente", 2, 4656.00 }; printf("Valores do registro = %d, %s, %s, %d, %.2f\n", func.cod, func.nome, func.cargo, func.depto, func.salario); system("pause"); }
9

Arquivos

Arquivos
Podem ser armazenados em dispositivos de memria auxiliar (discos). Permitem o armazenamento permanente da informao. A alterao de um arquivo durante a execuo de um programa torna permanente (alm do tempo de execuo do programa) o processamento realizado. Em arquivos possvel armazenar-se bem mais informaes do que na memria.
11

Arquivos em C
Tanto a entrada como a sada de dados acontecem atravs do processamento de streams, independentemente do perifrico Streams so armazenados em dispositivos de memria auxiliar de forma permanente, a partir do uso de perifricos que aceitam tanto a leitura como a gravao de dados. Assim, em C, arquivos podem ser definidos como repositrios permanentes de streams Algumas operaes sobre um arquivo: abertura, leitura, escrita, fechamento As operaes de entrada e sada de dados sobre um arquivo (includos os arquivos padro: stdin - de entrada e stdout - de sada) so apoiadas pelo armazenamento temporrio de streams em reas da memria principal denominadas buffers

12

Arquivos em C
Abre/ Cria Arquivo x
Descarrega

Arquivos em C
associado a um dispositivo de armazenamento pode ser tratado como stream
sequncia de bytes sequncia de registros (estruturas)
MANIPULA

buffer

acesso
sequencial aleatrio/randmico
0 1 2 3 4 5 ...... N-1 eof

Buffer do arquivo x

Disco

Fecha e salva em DISCO

Memria principal

0
Movimentao de dados Funes 13

29 30 nome2 1 0

59 60 2

89 90 3

129 ...... ......


14

Nome1 fone1

fone2 nome3 fone3 nome4 fone4 ......

Arquivos em C
Arquivos de Texto: Os dados so gravados como caracteres de 8 bits
Ex.: Um nmero inteiro de 32 bits com 8 dgitos ocupar 64 bits no arquivo

Arquivos Binrios em C
No tem limitao de tamanho Comprimento do arquivo: funo do nmero e da natureza dos elementos que apresenta no momento Elementos no tm nome Somente um elemento acessvel a cada momento elemento corrente; Acesso aos dados: seqencial ou randmico
15 16

Arquivos Binrios: Os dados so gravados na forma binria (do mesmo modo que esto na memria)
Ex.: Um nmero inteiro de 32 bits com 8 dgitos ocupar 32 bits no arquivo

Arquivos Binrios em C
Um arquivo existe fisicamente no sistema de arquivos de forma independente dos programas que o utilizam Para que um programa possa criar, ou utilizar um arquivo pr-existente, o arquivo deve primeiro existir internamente ao programa, na forma de um ponteiro do tipo FILE. Para cada arquivo um ponteiro desse tipo deve ser declarado.

Arquivos Binrios em C
Um arquivo em C representado pelo tipo FILE* Quando queremos abrir um arquivo utilizamos a funo fopen e para fech-lo usamos a funo fclose.
Ex.:

FILE *arq;
A associao entre o arquivo fsico, existente no meio externo, e o ponteiro FILE correspondente, existente no programa, feita atravs da operao de abertura do arquivo.
17

FILE* arquivo = fopen(nome.txt, wb);

fclose (arquivo);
18

fopen
fopen recebe duas strings como parmetros: Nome do Arquivo: Caminho relativo do arquivo
Ex.: lab11.c, c:/temp/lab1.c

Modos de abertura: arquivos binrios


Modo de abertura rb wb r+b ou rb+ w+b ou wb+ ab a+b ou ab+ Arquivo Existe ok cria novo, antigo eliminado ok cria novo, antigo eliminado novos dados acrescentados ao final novos dados acrescentados ao final Arquivo no existe erro cria erro cria cria (como se fosse wb) cria (como se fosse wb+) Permisso de Permisso de leitura escrita x x x x x x x

Modo de abertura: Determina como o arquivo deve ser aberto, os principais so:
w: Escrita, se o arquivo existir cria um novo. r: Leitura, se o arquivo no existir d erro. a : Edio, se o arquivo no existir d erro.

x x

A funo fopen retornar um ponteiro para o arquivo ou 0(zero) caso ocorra algum problema na abertura.
19 20

fclose
fclose recebe o ponteiro do arquivo a ser fechado FILE* arquivo = fopen(nome.txt, wb); fclose (arquivo); Obs.: A string wb indica que queremos abrir um arquivo binrio para escrita. Sempre que quisermos abrir um arquivo binrio acrescentamos o caracter b na string do modo de abertura.
21

fread
fread (&varbuffer, numbytes, quant, FILE * ) L para a memria principal blocos de bytes de um arquivo, a partir do elemento corrente Os parmetros dessa funo so:
onde os dados lidos devem ser armazenados: &varbuffer, que pode ser o endereo de uma varivel com o tamanho dos bytes que sero lidos ou um ponteiro o tamanho em bytes da unidade a ser lida: numbytes quantas unidades devero ser lidas: quant o ponteiro para o arquivo sendo lido: FILE *

Em uma operao de leitura com fread o nmero total de bytes lidos : numbytes * quant Retorno da funo: o nmero de unidades lidas Que poder ser menor que o previsto se o final do arquivo for alcanado antes do esperado

22

Leitura seqencial arquivo binrio


void listarq (FILE *arq) { float x; while (fread (&x, sizeof(float), 1, arq) !=0) printf("\n%6.2f ",x); } A funo listarq l um arquivo seqencialmente O while conclura quando uma tentativa de leitura resultar em zero bytes lidos, ou seja, no for bem sucedida por ter sido encontrado o final do arquivo
23

feof
feof (FILE *) Indica se um arquivo chegou ao fim Retorna verdadeiro (no-zero) caso o final tenha sido atingido, falso (zero) caso contrrio Quando ocorre a situao fim de arquivo?
Sempre que a posio corrente de um arquivo estiver alm do nmero de bytes que ele contm armazenado Logo: se um arquivo vazio for aberto, s vai ser detectado o fim de arquivo aps uma tentativa de leitura
24

Leitura seqencial arquivo binrio


void ListagemAtletas(FILE *arq2, struct atleta buffer) { printf("-----Comeco da listagem-----\n"); while (!(feof(arq2))) if (fread(&buffer,sizeof(struct atleta),1,arq2) == 1) {//le e confirma se o que foi lido eh estrutura, printf("Nome: %s\n", buffer.nome); printf("Idade: %d\n", buffer.idade); printf("Altura: %6.2f\n\n", buffer.altura); } printf("-----Fim da listagem-----\n"); } A funo ListagemAtletas l um arquivo seqencialmente. O while (!feof(arq2))) conclura quando for detectado que o arquivo est posicionado alm do seu limite em bytes. Como a situao de fim de arquivo s detectada quando uma tentativa de leitura mal sucedida, ento necessrio verificar o resultado da operao de leitura a cada nova tentativa.
25

fwrite
fwrite (&varbuffer, numbytes, quant, FILE *) Grava blocos de bytes em um arquivo, a partir do elemento corrente Os parmetros dessa funo so:
de onde os dados devem ser obtidos: &varbuffer, que pode ser o endereo de uma varivel ou um ponteiro o tamanho em bytes da unidade a ser gravada: numbytes quantas unidades devero ser gravadas: quant o ponteiro para o arquivo sendo gravado: FILE *

Em uma operao de escrita com fwrite o nmero total de bytes gravados : numbytes * quant Retorno da funo: o nmero de unidades gravadas Podem ocorrer erros durante a gravao
26

fread, fwrite, fclose


FILE* leitura = fopen(entrada.txt, rb); FILE* escrita = fopen(saida.txt, wb); int val; fread(&val, sizeof(int), 1, leitura); fwrite(&val, sizeof(int), 1, escrita); int vetor[100]; fread(vetor, sizeof(int),100, leitura); fwrite(vetor, sizeof(int),100, escrita); fclose(leitura); fclose(escrita);
27

fseek
k = fseek(FILE fp, long int offset, int base) Define a nova posio corrente do arquivo fp. A nova posio calculada adicionando o valor de offset (contado em bytes) posio indicada por base.
base = 0 incio do arquivo base = 1 valor corrente base = 2 fim do arquivo

Retorna zero se a operao teve sucesso ou diferente de zero se algum problema ocorreu.
28

L e mostra arquivo binrio


#include <stdio.h> #include <stdlib.h> #define maxreg 5 void cria_arq_int(char nome_arq[]) { FILE *fp; int a[5]; int i, j; // abre o arquivo para gravao fp = fopen(nome_arq, "wb"); srand(12); for (i = 0; i < maxreg; i++) { //- cria 5 registros aleatrios a[0] = i; for (j = 1; j < 5; j++) a[j] = rand(); void le_mostra_registro(int nreg, char nome_arq[]) { FILE *fp; int a[5]; int i;

L e mostra arquivo binrio


main() { char nome[] = "novoarquivo"; int nr = 1;

// abre o arquivo para leitura


fp = fopen(nome_arq, "rb");

// posiciona no registro nreg // fseek (FILE , offset, base)


fseek(fp, nreg * 5 * sizeof(int), 0);

// cria arquivo com max registros


cria_arq_int (nome); while(nr != 0) {

// verifica se esse registro realmente existe


if (fread(a, sizeof (int), 5, fp)) {

// entra com numero do registro a ser lido


printf("\nregistro a ser lido: (0 p/ encerrar) "); scanf("%d", &nr); if (nr >0 )

// mostra no vdeo
printf("\nregistro %5d - ", nreg); for (i = 0; i < 5; i++) printf("%10d", a[i]); } else printf("\nregistro %5d - inexistente", nreg); fclose(fp); }
29

// cada linha tem 5 numeros


fwrite(a, sizeof (int), 5, fp); } fclose(fp); }

// le e mostra o registro
le_mostra_registro(nr, nome); } }
30

Arquivos Texto em C
Para ler ou escrever em um Arquivo Texto, utilizamos as funes:
fscanf: Idntica ao scanf, s que recebe o ponteiro para o arquivo como primeiro parmetro fprintf: Idntica ao printf, s que recebe o ponteiro para o arquivo como primeiro parmetro

Exerccio
1) Faa um programa que copie o contedo de um arquivo texto para outro 2) Faa um programa que leia valores digitados (double) e os grave em um arquivo, cujo nome tambm dado. Em seguida mostre o contedo do arquivo no vdeo.
FILE* arquivo = fopen(nome.txt, wb); fread (&x, sizeof(double), 1, arquivo); if (feof(arquivo)) fclose (arquivo); TEXTO: char texto[256]; fscanf(arquivo, %s, texto); fprintf(arquivo, %s, texto);
31 32

Importante: fscanf deve ser usado apenas com arquivos abertos para leitura e fprintf com arquivos abertos para escrita.

include<stdio.h> int main() { char texto[100]; FILE *leitura, *escrita; leitura = fopen (leitura.txt, r); if (leitura ==0 ) { printf(Nao abriu o leitura.txt); return0; } escrita = fopen(escrita.txt, w); if( escrita ==0 ) { printf(Nao abriu o escrita.txt); return0; } fscanf(leitura, %s, texto); fprintf(escrita, %s, texto); fclose(leitura); fclose(escrita); return 0; }
33

Le valores digitados (double) e os grava em um arquivo, cujo nome tambm dado. Em seguida mostra o contedo do arquivo no vdeo.
#include <stdio.h> int main() { FILE *fp; char nome_arquivo[32]; double a; printf("\nentre com o nome do arquivo:"); // le o nome do arquivo scanf("%s",nome_arquivo); fp = fopen (nome_arquivo,"w"); // abre o arquivo para gravao

// le nomes e notas e grava no arquivo:: le o primeiro numero para comear


printf("\n entre com um numero:"); scanf("%lf", &a); while (a != -999) { fprintf (fp, "%10.4lf", a); printf ("\nentre com um numero:"); // le o prximo nmero scanf ("%lf", &a); } fclose (fp); // abre o mesmo arquivo para leitura fp = fopen (nome_arquivo,"r"); printf("\n***** conteudo do arquivo criado ******\n"); while (fscanf (fp, "%lf", &a) != EOF) printf ("%10.4lf * ", a); // le e mostra todos fclose (fp); return 0; }
34

Das könnte Ihnen auch gefallen