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