Prof.: José Eustáquio Rangel de Queiroz [email protected] rangeldequeiroz@gmail

49
DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br Carga Horária: 60 horas Carga Horária: 60 horas Prof.: José Eustáquio Rangel de Queiroz [email protected] [email protected]

description

Alocação de Memória. e Funções de E/S. Técnicas de Programação. Prof.: José Eustáquio Rangel de Queiroz [email protected] [email protected]. 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 [email protected] rangeldequeiroz@gmail

Page 1: 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

[email protected]@gmail.com

Prof.: José Eustáquio Rangel de Queiroz

[email protected]@gmail.com

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

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

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

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

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

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

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

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

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

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)

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

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");}}

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

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))

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

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

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

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

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

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");}}

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

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!

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

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

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

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

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

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

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

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");}}

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

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

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

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()

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

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

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

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

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

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);

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

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);}}

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

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

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

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()

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

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()

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

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()

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

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()

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

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

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

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()

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

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

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

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

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

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()

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

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()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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()

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

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()

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

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()

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

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()

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

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()

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

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()

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

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

Page 49: 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

{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