Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

Post on 06-Jan-2016

24 views 0 download

description

Alocação de Memória. e Funções de E/S. Técnicas de Programação. Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com. Carga Horária: 60 horas. Carga Horária: 60 horas. Alocação de Memória. Tó p icos 1 Alocação Dinâmica 2 Heap 3 Pilha - PowerPoint PPT Presentation

Transcript of Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

DSC/CCT/UFCGDSC/CCT/UFCG

{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

Carga Horária: 60 horasCarga Horária: 60 horasCarga Horária: 60 horasCarga Horária: 60 horas

Prof.: José Eustáquio Rangel de Queiroz

rangel@dsc.ufcg.edu.brrangeldequeiroz@gmail.com

Prof.: José Eustáquio Rangel de Queiroz

rangel@dsc.ufcg.edu.brrangeldequeiroz@gmail.com

2{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Tópicos

1 Alocação Dinâmica2 Heap3 Pilha4 E/S em C

Tópicos

1 Alocação Dinâmica2 Heap3 Pilha4 E/S em C

Alocação de MemóriaAlocação de Memória

3{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica IAlocação Dinâmica I Alocação Dinâmica

Declaração de uma variável Alocação de memória pelo compilador para armazenamento da variável

Alterações de requisitos do programa/ da variável Edição para realização das alterações e recompilação do programa

Alocação Dinâmica

Declaração de uma variável Alocação de memória pelo compilador para armazenamento da variável

Alterações de requisitos do programa/ da variável Edição para realização das alterações e recompilação do programa

4{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica IIAlocação Dinâmica II Alocação Dinâmica

Alocação de espaço de armazenamento durante a execução Redução no número de alterações nos tamanhos das variáveis

Alocação Dinâmica Retorno de um apontador para o início do intervalo de memória pela biblioteca de execução de C

Alocação Dinâmica

Alocação de espaço de armazenamento durante a execução Redução no número de alterações nos tamanhos das variáveis

Alocação Dinâmica Retorno de um apontador para o início do intervalo de memória pela biblioteca de execução de C

5{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica IIIAlocação Dinâmica III Alocação Dinâmica

Alocação de memória durante a execução Uso da função mallocmalloc

Sintaxe

#include <alloc.h>

void *malloc(size_t num_bytes);

num_bytes número de bytes a ser alocado

Alocação Dinâmica

Alocação de memória durante a execução Uso da função mallocmalloc

Sintaxe

#include <alloc.h>

void *malloc(size_t num_bytes);

num_bytes número de bytes a ser alocado

6{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica IVAlocação Dinâmica IV Uso de mallocmalloc

Satisfatório Retorno de um apontador para o início do intervalo

Insatisfatório Retorno de NULL (ocorrência de erro)

Uso de mallocmalloc

Satisfatório Retorno de um apontador para o início do intervalo

Insatisfatório Retorno de NULL (ocorrência de erro)

7{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica VAlocação Dinâmica V Exemplo 1 – Uso de mallocmalloc Exemplo 1 – Uso de mallocmalloc#include <stdio.h>#include <stdio.h>#include <alloc.h>#include <alloc.h>

void main(void)void main(void){{ char *string;char *string; int *int_dados;int *int_dados; float *float_dados;float *float_dados;

if ((string = (char *) malloc(50)))if ((string = (char *) malloc(50))) printf(“Sucesso na alocação de uma string de 50 bytes\n");printf(“Sucesso na alocação de uma string de 50 bytes\n"); elseelse printf("Erro na alocação da string\n");printf("Erro na alocação da string\n");

if ((int_dados = (int *) malloc(100 * sizeof(int))) != NULL)if ((int_dados = (int *) malloc(100 * sizeof(int))) != NULL) printf(" Sucesso na alocação de int_dados[100]\n");printf(" Sucesso na alocação de int_dados[100]\n"); else else printf(" Erro na alocação de int_dados[100]\n");printf(" Erro na alocação de int_dados[100]\n");

if ((float_dados = (float *) malloc(25 * sizeof(float))) != NULL)if ((float_dados = (float *) malloc(25 * sizeof(float))) != NULL) printf(" Sucesso na alocação de float_dados[25]\n");printf(" Sucesso na alocação de float_dados[25]\n"); elseelse printf(" Erro na alocação de float_dados[25]\n");printf(" Erro na alocação de float_dados[25]\n");}}

8{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica VIAlocação Dinâmica VI Uso de mallocmalloc – Conversão do tipo de

apontador Alocação de um apontador para n dados

do tipo intint

int *dados;int *dados;

dados = (int *) malloc(dados = (int *) malloc(n n * sizeof(int))* sizeof(int))

Alocação de um apontador para k dados do tipo floatfloat

float *dados;float *dados;

dados = (float *) malloc(dados = (float *) malloc(k k * sizeof(float))* sizeof(float))

Uso de mallocmalloc – Conversão do tipo de apontador Alocação de um apontador para n dados

do tipo intint

int *dados;int *dados;

dados = (int *) malloc(dados = (int *) malloc(n n * sizeof(int))* sizeof(int))

Alocação de um apontador para k dados do tipo floatfloat

float *dados;float *dados;

dados = (float *) malloc(dados = (float *) malloc(k k * sizeof(float))* sizeof(float))

9{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica VIIAlocação Dinâmica VII Liberação da memória alocada após o

uso Chamada da função free()

#include <alloc.h>

void free(apont);

apont apontador para o início do intervalo de memória a ser liberado

Liberação da memória alocada após o uso Chamada da função free()

#include <alloc.h>

void free(apont);

apont apontador para o início do intervalo de memória a ser liberado

10{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica VIIIAlocação Dinâmica VIII Uso da função calloc()

malloc() Número de bytes a ser alocado calloc() Número de elementos de um

tamanho específico a serem alocados Sintaxe

#include <alloc.h>

void *calloc(size_t num_itens, size_t tam_item);

num_itens Número de itens a serem alocados

tam_item Tamanho (em bytes) de cada item

Uso da função calloc() malloc() Número de bytes a ser alocado calloc() Número de elementos de um

tamanho específico a serem alocados Sintaxe

#include <alloc.h>

void *calloc(size_t num_itens, size_t tam_item);

num_itens Número de itens a serem alocados

tam_item Tamanho (em bytes) de cada item

11{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica IXAlocação Dinâmica IX Exemplo 2 – Uso de calloccalloc Exemplo 2 – Uso de calloccalloc#include <stdio.h>#include <stdio.h>#include <alloc.h>#include <alloc.h>

void main(void)void main(void){{ char *string;char *string; int *int_dados;int *int_dados; float *float_dados;float *float_dados;

if ((string = (char *) calloc(50, sizeof(char))))if ((string = (char *) calloc(50, sizeof(char)))) printf(“Sucesso na alocação de uma string de 50 bytes\n");printf(“Sucesso na alocação de uma string de 50 bytes\n"); elseelse printf("Erro de alocação da string\n");printf("Erro de alocação da string\n");

if ((int_dados = (int *) calloc(100, sizeof(int))) != NULL)if ((int_dados = (int *) calloc(100, sizeof(int))) != NULL) printf(" Sucesso na alocação de int_dados[100]\n");printf(" Sucesso na alocação de int_dados[100]\n"); else else printf(" Erro de alocação de int_dados[100]\n");printf(" Erro de alocação de int_dados[100]\n");

if ((float_dados = (float *) calloc(25, sizeof(float))) != NULL)if ((float_dados = (float *) calloc(25, sizeof(float))) != NULL) printf(" Sucesso na alocação de float_dados[25]\n");printf(" Sucesso na alocação de float_dados[25]\n"); elseelse printf(" Erro de alocação de float_dados[25]\n");printf(" Erro de alocação de float_dados[25]\n");}}

12{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Alocação Dinâmica XAlocação Dinâmica X Uso de calloccalloc

Satisfatório Retorno de um apontador para o início do intervalo

Insatisfatório Retorno de NULL (ocorrência de erro)

Liberação após o uso a partir da função free()free()

Uso de calloccalloc

Satisfatório Retorno de um apontador para o início do intervalo

Insatisfatório Retorno de NULL (ocorrência de erro)

Liberação após o uso a partir da função free()free()

Se o programa NÃO usar Se o programa NÃO usar free()free() para liberar a para liberar a memória após o uso, a liberação ocorrerá memória após o uso, a liberação ocorrerá automaticamente. Todavia, é ACONSELHÁVEL automaticamente. Todavia, é ACONSELHÁVEL liberar a memória assim que esta não mais for liberar a memória assim que esta não mais for necessária! necessária!

Se o programa NÃO usar Se o programa NÃO usar free()free() para liberar a para liberar a memória após o uso, a liberação ocorrerá memória após o uso, a liberação ocorrerá automaticamente. Todavia, é ACONSELHÁVEL automaticamente. Todavia, é ACONSELHÁVEL liberar a memória assim que esta não mais for liberar a memória assim que esta não mais for necessária! necessária!

13{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Heap IHeap I Heap

Reservatório de memória não usado, a partir do qual a biblioteca de execução de CC reserva memória quando programas alocam dinamicamente a memória

Modelo de memória small Área de memória entre o topo da área de dados do programa compilado e a pilha

Heap

Reservatório de memória não usado, a partir do qual a biblioteca de execução de CC reserva memória quando programas alocam dinamicamente a memória

Modelo de memória small Área de memória entre o topo da área de dados do programa compilado e a pilha

14{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Heap IIHeap II Heap Heap

Pilha

HeapHeap

Dados

Segmento de Dados de 64 KB

15{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Heap IIIHeap III

Heap

Residente no segmento de dados do programa

Quantidade de heap disponível para um programa Fixa

Falha de alocação para quantidades de memória superiores a 64 KB

Heap

Residente no segmento de dados do programa

Quantidade de heap disponível para um programa Fixa

Falha de alocação para quantidades de memória superiores a 64 KB

16{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Heap IVHeap IV Exemplo 3 – Falha de alocação por falta

de espaço

Exemplo 3 – Falha de alocação por falta de espaço#include <stdio.h>#include <stdio.h>#include <alloc.h>#include <alloc.h>

void main(void)void main(void){{ char *m1, *m2, *m3;char *m1, *m2, *m3;

if ((m1 = (char *) malloc(30000)) == NULL)if ((m1 = (char *) malloc(30000)) == NULL) printf("Erro de alocação da matriz 1\n");printf("Erro de alocação da matriz 1\n"); else if ((m2 = (char *) malloc(30000)) == NULL)else if ((m2 = (char *) malloc(30000)) == NULL) printf("Erro de alocação da matriz 2\n");printf("Erro de alocação da matriz 2\n"); else if ((m3 = (char *) malloc(30000)) == NULL)else if ((m3 = (char *) malloc(30000)) == NULL) printf("Erro de alocação da matriz 3\n");printf("Erro de alocação da matriz 3\n"); elseelse printf(“Sucesso na alocação de todas as matrizes \n");printf(“Sucesso na alocação de todas as matrizes \n");}}

17{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Heap VHeap V Contorno da Limitação de 64 KB para o

Heap

Uso de farmalloc() e farcalloc()

Parâmetros idênticos àqueles passados para malloc() e calloc()

Necessidade de uso de um ponteiro far para os dados

Contorno da Limitação de 64 KB para o Heap

Uso de farmalloc() e farcalloc()

Parâmetros idênticos àqueles passados para malloc() e calloc()

Necessidade de uso de um ponteiro far para os dados

18{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdio.h>#include <alloc.h>#include <alloc.h>#include <conio.h>#include <conio.h>

void main(void)void main(void){{ char *string;char *string; int *int_dados;int *int_dados; float *float_dados;float *float_dados;

clrscr();clrscr(); if ((string = (char *) malloc(50000)))if ((string = (char *) malloc(50000))) printf(“Sucesso na alocação de uma string de 50 Kbytes\n");printf(“Sucesso na alocação de uma string de 50 Kbytes\n"); else printf("Erro na alocação da string\n");else printf("Erro na alocação da string\n");

if ((int_dados = (int *) malloc(100000 * sizeof(int))) != NULL)if ((int_dados = (int *) malloc(100000 * sizeof(int))) != NULL) printf(" Sucesso na alocação de int_dados[100000]\n");printf(" Sucesso na alocação de int_dados[100000]\n"); else printf(" Erro na alocação de int_dados[100000]\n");else printf(" Erro na alocação de int_dados[100000]\n");

if ((float_dados = (float *) malloc(250 * sizeof(float))) != NULL)if ((float_dados = (float *) malloc(250 * sizeof(float))) != NULL) printf(" Sucesso na alocação de float_dados[250]\n");printf(" Sucesso na alocação de float_dados[250]\n"); else printf(" Erro na alocação de float_dados[250]\n");else printf(" Erro na alocação de float_dados[250]\n"); getch();getch();}}

Heap VIHeap VI Exemplo 4 – Alocação com farmalloc() Exemplo 4 – Alocação com farmalloc()

19{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Pilha IPilha I Uso da função alloca()

Alocação de memória durante chamadas de funções específicas

Parâmetros idênticos àqueles passados para malloc()

Isenção do uso da função free() para a liberação de memória previamente alocada

Liberação automática da memória alocada quando a execução da função terminar

Uso da função alloca()

Alocação de memória durante chamadas de funções específicas

Parâmetros idênticos àqueles passados para malloc()

Isenção do uso da função free() para a liberação de memória previamente alocada

Liberação automática da memória alocada quando a execução da função terminar

20{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Pilha IIPilha II Recomendações no uso de alloca()

Restauração correta do apontador da pilha Declaração de variáveis locais na função

Garantia de uma estruturação correta da pilha Declaração de uma variável local após a declaração da variável de apontamento para a qual alloca atribui seu resultado

Recomendações no uso de alloca()

Restauração correta do apontador da pilha Declaração de variáveis locais na função

Garantia de uma estruturação correta da pilha Declaração de uma variável local após a declaração da variável de apontamento para a qual alloca atribui seu resultado

21{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Pilha IIIPilha III Recomendações no uso de alloca()

Exemplo da forma de declaração recomendada

char *apont;char pilha_certa[1];

pilha_certa[0] = NULL;apont = alloca(tamanho);

Recomendações no uso de alloca()

Exemplo da forma de declaração recomendada

char *apont;char pilha_certa[1];

pilha_certa[0] = NULL;apont = alloca(tamanho);

22{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdio.h>#include <malloc.h>#include <malloc.h>

void func(size_t tam)void func(size_t tam){{ int i;int i; char *apont, pilha_certa[1];char *apont, pilha_certa[1];

pilha_certa[0] = NULL;pilha_certa[0] = NULL;

if ((apont = alloca(tamanho)) == NULL)if ((apont = alloca(tamanho)) == NULL) printf("Erro na alocação de %u Bytes da pilha\n", tam);printf("Erro na alocação de %u Bytes da pilha\n", tam); elseelse {{ for (i = 0; i < tam; i++)for (i = 0; i < tam; i++) apont[i] = i;apont[i] = i; printf("Um buffer de %u Bytes foi alocado e usado\n", tam);printf("Um buffer de %u Bytes foi alocado e usado\n", tam); }}}}

Pilha IVPilha IV Exemplo 5 – Alocação com alloca() Exemplo 5 – Alocação com alloca()

void main(void)void main(void){{ func(1000);func(1000); func(32000);func(32000); func(65000);func(65000);}}

23{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

FUNCAO OPERACAO

getchar ( ) lê um caractere; espera por <enter>

getche ( ) lê um caractere com eco; não espera por <enter>

getch ( ) lê um caractere sem eco; não espera por <enter>

putchar ( ) imprime um caractere na tela

gets ( ) lê uma string via teclado

puts ( ) imprime uma string na tela

FUNÇÃO OPERAÇÃO

E/S em C I

E/S em C I

Funções de E/S via Console Funções de E/S via Console

24{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

main ( )main ( ){{

char ch;char ch; clrscr();clrscr();printf ( “\nDigite um caractere”);printf ( “\nDigite um caractere”);ch = getchar( );ch = getchar( );printf (“\n Todos sabem que você digitou %c”, ch);printf (“\n Todos sabem que você digitou %c”, ch);

}}

E/S em C II

E/S em C II

Exemplo 6 – Uso de getchar() Exemplo 6 – Uso de getchar()

25{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

main ( )main ( ){{ char ch;char ch; ch = getch( );ch = getch( ); printf (“ \ nSomente agora saberemos”);printf (“ \ nSomente agora saberemos”); printf (“que você digitou %c”, ch);printf (“que você digitou %c”, ch);}}

E/S em C III

E/S em C III

Exemplo 7 – Uso de getch() Exemplo 7 – Uso de getch()

26{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdio.h>int main()int main(){{

char buffer[10];char buffer[10];clrscr();clrscr(); printf(”\nDigite seu nome");printf(”\nDigite seu nome");gets(buffer);gets(buffer);printf(”\nO nome é: %s\n", buffer);printf(”\nO nome é: %s\n", buffer);return 0;return 0;

}}

E/S em C IV

E/S em C IV

Exemplo 8 – Uso de gets() Exemplo 8 – Uso de gets()

27{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

main ( ) main ( ) {{

char nome[40];char nome[40];clrscr();clrscr();printf (“\nDigite seu nome: ”);printf (“\nDigite seu nome: ”);gets (&nome[0]);gets (&nome[0]);puts (“Bom dia ”); puts (“Bom dia ”); puts (nome);puts (nome);

}}

E/S em C V

E/S em C V

Exemplo 9 – Uso de puts() Exemplo 9 – Uso de puts()

28{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

do do {{

letra = getchar();letra = getchar();putchar(letra); putchar(letra);

} while(letra != ‘\n’);} while(letra != ‘\n’);

do do putchar(letra = putchar(letra = getchar());getchar());

while(letra != ‘\n’);while(letra != ‘\n’);

Não são funções, são macros Não são funções, são macros

Alguns compiladores não permitema inserção de espaços entre os nomes das macros e os parênteses

Alguns compiladores não permitema inserção de espaços entre os nomes das macros e os parênteses

getchar()/ putchar() getchar()/ putchar()

E/S em C VI

E/S em C VI

29{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <ctype.h>#include <conio.h>

void main(void){

int letra;

printf("Quer continuar? (S/N): ");do

{letra = getche();letra = toupper(letra);

} while ((letra != 'S') && (letra != 'N'));

if (letra == 'S')printf("\nOK\n");

elseprintf("\nPor que nao?\n");

}

#include <stdio.h>#include <ctype.h>#include <conio.h>

void main(void){

int letra;

printf("Quer continuar? (S/N): ");do

{letra = getche();letra = toupper(letra);

} while ((letra != 'S') && (letra != 'N'));

if (letra == 'S')printf("\nOK\n");

elseprintf("\nPor que nao?\n");

}

E/S em C VII

E/S em C VII

Macro toupper()

Macro toupper()

30{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

E/S em C VIII

E/S em C VIII

Funções de E/S via Console Funções de E/S via Console

31{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

ESPECIFICAÇÃO DE FORMATOESPECIFICAÇÃO DE FORMATO

Formato Descrição

%d Número decimal

%ld Número decimal longo

%o Notação octal sem sinal

%x Hexadecimal sem sinal

%u Decimal sem sinal

%c Um único caractere

%s String

%e Notação científica

%f Ponto flutuante

%g Menor entre %e e %f

%p Endereço de memória

%% Impressão de um %

printf() printf()

E/S em C IX

E/S em C IX

32{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

num1 tamanho total em caracteres do valor a escrever;

num2 precisão (número de algarismos decimais).

indicador na forma num1.num2

tamanho em caracteres do valor a escrever (se o valor para ser escrito ocupar mais caracteresdo que o especificado, não é truncado);

valor inteiro

o valor a escrever contémsempre um sinal (- ou +);

+ (sinal mais)

faz uma justificação à esquerda;─ (sinal menos)

SignificadoIndicadores

num1 tamanho total em caracteres do valor a escrever;

num2 precisão (número de algarismos decimais).

indicador na forma num1.num2

tamanho em caracteres do valor a escrever (se o valor para ser escrito ocupar mais caracteresdo que o especificado, não é truncado);

valor inteiro

o valor a escrever contémsempre um sinal (- ou +);

+ (sinal mais)

faz uma justificação à esquerda;─ (sinal menos)

SignificadoIndicadores

E/S em C X

E/S em C X

printf() printf()

33{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

double%lf

float%f

unsigned int%u

long int%ld

int%d

TipoFormato

ESPECIFICAÇÃO DE FORMATO

ESPECIFICAÇÃO DE FORMATO

E/S em C XI

E/S em C XI

scanf() scanf()

34{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Barra\ \

Tabulacão vertical\v

Sinal sonoro\a

Aspas\“

Retrocesso (BACKSPACE)\b

Tabulação (TAB)\t

ENTER\r

Nova linha\n

E/S em C XII

E/S em C XII

Caracteres de Controle Caracteres de Controle

35{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include<stdio.h>main(){clrscr();puts("012345678901234567890

");printf("%-7.2f\n",123.234);printf("%7.2f\n",123.234);printf("%-5.2f\n",123.234);printf("%5.2f\n",3.324);printf("%10s\n","Alô");printf("%-10s\n","Alô");printf("%5.7s\n","123456789");}

Exemplo Exemplo

E/S em C XIII

E/S em C XIII

36{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

main(){char str[80];clrscr();puts("Digite abcdefghijklmnopqrstuvwxyz:");scanf("%20s",str);puts(str);scanf("%20s",str); /* o programa não parará nesta chamada a scanf() porque */puts(str); /* ainda haverá caracteres não transferidos no buffer de entrada */}

E/S em C XIV

E/S em C XIV

Exemplo Exemplo

37{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

E/S ANSI – Stream/Arquivo E/S ANSI – Stream/Arquivo

DescriçãoFunção

Reposiciona o localizador no inicio do arquivorewind()

Escreve um bloco de dadosfwrite()

Igual ao scanf() do consolefscanf()

Retorna verdadeiro se encontrou fim arquivofeof()

Retorna verdadeiro se ocorreu erroferror()

Lê um bloco de dadosfread()

Igual ao printf() do consolefprintf()

Lê um caractere de um arquivogetc(), fget(c)

Posiciona o arquivo em um byte específicofseek()

Fecha um STREAM (arquivo)fclose()

Escreve um caractere em um arquivoputc(), fput(c)

Abre um STREAM (arquivo) fopen()

Apaga um arquivoremove()

DescriçãoFunção

Reposiciona o localizador no inicio do arquivorewind()

Escreve um bloco de dadosfwrite()

Igual ao scanf() do consolefscanf()

Retorna verdadeiro se encontrou fim arquivofeof()

Retorna verdadeiro se ocorreu erroferror()

Lê um bloco de dadosfread()

Igual ao printf() do consolefprintf()

Lê um caractere de um arquivogetc(), fget(c)

Posiciona o arquivo em um byte específicofseek()

Fecha um STREAM (arquivo)fclose()

Escreve um caractere em um arquivoputc(), fput(c)

Abre um STREAM (arquivo) fopen()

Apaga um arquivoremove()

E/S em C XV

E/S em C XV

38{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

ProtótipoFunção

void rewind(FILE *stream); rewind()

size_t fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream);

fwrite()

int fscanf (FILE *stream const char *format, &arg1, &arg2, ...);fscanf()

int feof (FILE *stream); feof()

int ferror (FILE *stream); ferror()

size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);fread()

int fprintf (FILE *stream, const char *format, arg1, arg2, ...); fprintf()

int getc (FILE *stream);getc(), fget(c)

int fseek (FILE *fp,long numbytes,int origem); fseek()

int fclose (FILE *fp);fclose()

int putc(int c, FILE *stream); putc(), fput(c)

FILE *fopen(const char *filename, const char *mode); fopen()

Int remove(char *filename)remove()

ProtótipoFunção

void rewind(FILE *stream); rewind()

size_t fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream);

fwrite()

int fscanf (FILE *stream const char *format, &arg1, &arg2, ...);fscanf()

int feof (FILE *stream); feof()

int ferror (FILE *stream); ferror()

size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);fread()

int fprintf (FILE *stream, const char *format, arg1, arg2, ...); fprintf()

int getc (FILE *stream);getc(), fget(c)

int fseek (FILE *fp,long numbytes,int origem); fseek()

int fclose (FILE *fp);fclose()

int putc(int c, FILE *stream); putc(), fput(c)

FILE *fopen(const char *filename, const char *mode); fopen()

Int remove(char *filename)remove()

E/S em C XVI

E/S em C XVI

E/S ANSI – Stream/Arquivo E/S ANSI – Stream/Arquivo

39{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

fopen() FILE *fopen(const char *filename, const char *mode); fopen() FILE *fopen(const char *filename, const char *mode);

Acrescenta dados binários no fim do arquivo, como no modo "a"anterior, só que o arquivo é binário.

"ab"

Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário.

"wb"

Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário.

"rb"

Abrir um arquivo texto para gravação. Os dados serãoadicionados no fim do arquivo ("append"), se ele já existir, ouum novo arquivo será criado, no caso de arquivo não existenteanteriormente.

"a"

Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o conteúdo anterior será destruído.

"w"

Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto.

"r"

SignificadoModo

Acrescenta dados binários no fim do arquivo, como no modo "a"anterior, só que o arquivo é binário.

"ab"

Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário.

"wb"

Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário.

"rb"

Abrir um arquivo texto para gravação. Os dados serãoadicionados no fim do arquivo ("append"), se ele já existir, ouum novo arquivo será criado, no caso de arquivo não existenteanteriormente.

"a"

Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o conteúdo anterior será destruído.

"w"

Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto.

"r"

SignificadoModo

E/S em C XVII

E/S em C XVII

40{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

fopen() FILE *fopen(const char *filename, const char *mode); fopen() FILE *fopen(const char *filename, const char *mode);

Acrescenta dados binários no fim do arquivo, como no modo "a"anterior, só que o arquivo é binário.

"ab"

Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário.

"wb"

Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário.

"rb"

Abrir um arquivo texto para gravação. Os dados serãoadicionados no fim do arquivo ("append"), se ele já existir, ouum novo arquivo será criado, no caso de arquivo não existenteanteriormente.

"a"

Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o conteúdo anterior será destruído.

"w"

Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto.

"r"

SignificadoModo

Acrescenta dados binários no fim do arquivo, como no modo "a"anterior, só que o arquivo é binário.

"ab"

Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário.

"wb"

Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário.

"rb"

Abrir um arquivo texto para gravação. Os dados serãoadicionados no fim do arquivo ("append"), se ele já existir, ouum novo arquivo será criado, no caso de arquivo não existenteanteriormente.

"a"

Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o conteúdo anterior será destruído.

"w"

Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto.

"r"

SignificadoModo

E/S em C XVIII

E/S em C XVIII

41{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

fopen() fopen()

FILE *fp;fp = fopen ("test", "w");

Forma usual:Forma usual:

FILE *fp; if ((fp=fopen("teste", "w")) == NULL) {

puts(“Não posso abrir o arquivo\n"); exit(1);

}

FILE *fp;fp = fopen ("test", "w");

Forma usual:Forma usual:

FILE *fp; if ((fp=fopen("teste", "w")) == NULL) {

puts(“Não posso abrir o arquivo\n"); exit(1);

}

E/S em C XIX

E/S em C XIX

42{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include<stdio.h>#include <conio.h>void main( ){

FILE *fp;char texto[ ] = {“A prova está próxima”};fp = fopen(“lembrete.txt”,”w”);fprintf(fp,”%s”,texto);fclose(fp);getch();

}

#include<stdio.h>#include <conio.h>void main( ){

FILE *fp;char texto[ ] = {“A prova está próxima”};fp = fopen(“lembrete.txt”,”w”);fprintf(fp,”%s”,texto);fclose(fp);getch();

}

E/S em C XX

E/S em C XX

Exemplo 10 – Uso de fopen() Exemplo 10 – Uso de fopen()

43{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdlib.h>int main(){FILE *fp;char string[100];int i;fp = fopen("arquivo.txt","w"); /* Arquivo ASCII, para escrita */if(!fp){

printf( "Erro na abertura do arquivo");exit(0);

}printf("Entre com a string a ser gravada no arquivo:");gets(string);for(i=0; string[i]; i++) putc(string[i], fp); /* Grava a string, caractere a

caractere */fclose(fp);return 0;

}

E/S em C XXI

E/S em C XXI

Exemplo 11 – Uso de fopen() Exemplo 11 – Uso de fopen()

44{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdlib.h>int main(){FILE *pf;float pi = 3.1415;float pi_lido;if((pf = fopen("arquivo.bin", "wb")) == NULL) /* Abre arquivobináriopara escrita */{printf("Errona aberturado arquivo");exit(1);}if(fwrite(&pi, sizeof(float), 1,pf) != 1) /* Escrevea variávelpi */printf("Errona escrita do arquivo");fclose(pf); /* Fecha o arquivo */return(0);}

E/S em C XXII

E/S em C XXII

Exemplo 12 – Uso de fopen() Exemplo 12 – Uso de fopen()

45{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdlib.h>int main(){FILE *pf;float pi_lido;if((pf = fopen("arquivo.bin", “rb")) == NULL) /* Abre arquivo bináriopara leitura */{printf("Erro na abertura do arquivo");exit(1);}if(fread(&pi_lido, sizeof(float), 1,pf) != 1) /* Le em pi_lido o valor davariável armazenada anteriormente */printf("Erro na leitura do arquivo");printf("\nO valor de PI, lido do arquivo e': %f", pi_lido);fclose(pf);return(0);}

#include <stdio.h>#include <stdlib.h>int main(){FILE *pf;float pi_lido;if((pf = fopen("arquivo.bin", “rb")) == NULL) /* Abre arquivo bináriopara leitura */{printf("Erro na abertura do arquivo");exit(1);}if(fread(&pi_lido, sizeof(float), 1,pf) != 1) /* Le em pi_lido o valor davariável armazenada anteriormente */printf("Erro na leitura do arquivo");printf("\nO valor de PI, lido do arquivo e': %f", pi_lido);fclose(pf);return(0);}

E/S em C XXIII

E/S em C XXIII

Exemplo 13 – Uso de fopen() Exemplo 13 – Uso de fopen()

46{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdlib.h>#define N 10int main(){FILE *pf;int num, numpar;if((pf = fopen(“saida.dat", "wb")) == NULL) /* Abre arquivo binário paraescrita */{printf("Erro na abertura do arquivo");exit(1);}for(num=0;num<=N;num++) {numpar = 2*num;if(fwrite(&numpar, sizeof(int),1,pf) != 1) /* Escreve a variável numpar */

printf("Erro na escrita do arquivo");}fclose(pf); /* Fecha o arquivo */return(0);}

E/S em C XXIV

E/S em C XXIV

Exemplo 14 – Uso de fwrite() Exemplo 14 – Uso de fwrite()

47{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

#include <stdio.h>#include <stdlib.h>#define N 10int main(){FILE *pf;int numpar, num;if((pf = fopen(“saida.dat", “rb")) == NULL) /* Abre arquivo binário para leitura */{printf("Erro na abertura do arquivo");exit(1);}for(num=0;num<=N;num++){if(fread(&numpar, sizeof(int),1,pf) != 1) /* Le em numpar o valor da variávelarmazenada anteriormente */printf("Erro na leitura do arquivo");printf("\nnumpar, lido do arquivo= %d", numpar);}fclose(pf);return(0);}

E/S em C XXV

E/S em C XXV

Exemplo 15 – Uso de fread() Exemplo 15 – Uso de fread()

48{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Repita os dois últimos exemplos, substituindo as funções fwrite() e fread() por fprintf() e fscanf(), respectivamente.

Repita os dois últimos exemplos, substituindo as funções fwrite() e fread() por fprintf() e fscanf(), respectivamente.

Exercício Exercício

E/S em C XXVI

E/S em C XXVI

DSC/CCT/UFCGDSC/CCT/UFCG

{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

{joseana, rangel}@dsc.ufcg.edu.br {joseana, rangel}@dsc.ufcg.edu.br

Joseana Macêdo FechineJosé Eustáquio Rangel de

Queiroz

Joseana Macêdo FechineJosé Eustáquio Rangel de

Queiroz

DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

UNIVERSIDADE FEDERAL DE CAMPINA GRANDE

UNIVERSIDADE FEDERAL DE CAMPINA GRANDECENTRO DE CIÊNCIAS E TECNOLOGIACENTRO DE CIÊNCIAS E TECNOLOGIA