Sie sind auf Seite 1von 17

Linguagem C

(Entrada & Sada)

Prof. Edson Pedro Ferlin

Pr-processador
by Prof. Edson Pedro Ferlin

#define
Usa-se o comando #define para definir um identificador e uma
string. O compilador substituir o identificador pela string toda
vez que ele for encontrado no arquivo-fonte.

O identificador chamado de nome de macro, e o processo


de substituio chamado de substituio de macro.

Forma geral: #define identificador string

Exemplos :
#define verdadeiro 1
#define Max_pix 256
#define um 1
#define erro_1 "erro padro na entrada\n"
#define PRN(n) printf("%f\n",n)
#define SOMA(x,y) (x + y)
#define Produto(x,y) ((x)*(y))
#define min(a,b) (a<b)?a:b

www.professorferlin.blogspot.com 1
Pr-processador
by Prof. Edson Pedro Ferlin

#include
O comando #include do pr-processador instrui o compilador a
incluir um outro arquivo fonte com aquele que contm o comando
#include. Devemos envolver o arquivo-fonte lido entre aspas ou
entre o sinal de maior e menor.

Exemplos : #include "stdio.h"


#include <stdio.h>

#include "stdio.h" indica que o compilador procurar o arquivo


stdio.h no diretrio corrente.

#include <stdio.h> indica que o compilador procurar o


arquivo stdio.h nos diretrios especificados na linha de comando
da opo -I do compilador, se no encontrar o arquivo, procurar
nos diretrios padres. O diretrio de trabalho corrente no
ser pesquisado em momento algum.

stdio.h
by Prof. Edson Pedro Ferlin

Entrada e Sada
o arquivo-cabealho de entrada e sada bufferizada do C
e se chama stdio.h (standard input/output) que
corresponde no UNIX ao arquivo io.h.

Fila de bytes: o sistema de arquivos bufferizado do C


transforma cada dispositivo fsico em um dispositivo lgico
chamado fila de byte. Todas as filas de bytes se
comportam de maneira similar. Como estas filas so
independentes do dispositivo, as mesmas funes que
podem escrever em um arquivo em disco podem tambm
escrever no vdeo:

Filas de texto: sequencia de caracteres que est organizada


em linhas que so encerradas por caracteres \n.

Filas binrias: sequencia de bytes que tem correspondncia


unvoca (um por um) com os bytes do dispositivo externo.
Portanto, nenhuma traduo de caracteres ocorre.

www.professorferlin.blogspot.com 2
Arquivos
by Prof. Edson Pedro Ferlin

Conceito Lgico
Em C, um arquivo um conceito lgico que o sistema pode
aplicar a qualquer coisa, desde arquivos em disco at terminais;

Todas as filas de bytes so iguais, mas nem todos os arquivos


so iguais;

O computador fechar automaticamente todos os arquivos


quando seu programa terminar normalmente por um main()
retornando ao SO ou chamando um exit(). Quando da queda do
sistema, o computador no fechar os arquivos;

No incio da execuo de um programa, so abertas trs filas de


texto predefinidas: stdin, stdout e stderr, que se referem ao
dispositivo de entrada e sada padro que est conectado ao
sistema (normalmente o console) e que podem ser
redirecionadas para um outro dispositivo (stdio.h).

Funes Bsicas
by Prof. Edson Pedro Ferlin

Entrada e Sada do Console

FUNO OPERAO

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


getche() l um caractere com eco; no espera por <enter>
getch() l um caractere sem eco; no espera por <enter>
putchar() escreve um caractere na tela
gets() l uma string do teclado
puts() escreve uma string na tela

www.professorferlin.blogspot.com 3
printf()
by Prof. Edson Pedro Ferlin

Um comando de formatao contm primeiro um sinal de (%) e,


depois, o cdigo de formatao.

%c um nico caracter
%d decimal
%i decimal
%e notao cientfica
%f ponto decimal flutuante
%g usa %e ou %f - aquele que for menor
%o octal
%s string de caracteres
%u decimal sem sinal
%x hexadecimal
%% imprime o sinal %
%p exibe um ponteiro
%n o argumento associado ser um ponteiro no qual ser colocado o
nmero de caracteres escritos at o momento.

printf()
by Prof. Edson Pedro Ferlin

Observaes

Para especificar o nmero de casas decimais em nmeros


de ponto flutuante, usa-se o formato: %w.df em que w o
campo total do nmero que se quer imprimir e d representa o
nmero de casas decimais. Por exemplo, %10.5f , %12.6f ,
%6.0f e %7.2f.

No caso dos strings, a notao %x.ys, x representa o


nmero mnimo e y o nmero mximo de caracteres a
serem exibidos. Por exemplo, %6.12s, exibir uma string com
pelo menos 6 caracteres e no mximo 12 caracteres. Caso a
string seja maior que a largura mxima do campo (y), o
computador truncar os caracteres que estiverem alm do
limite especificado.

www.professorferlin.blogspot.com 4
scanf()
by Prof. Edson Pedro Ferlin

Colocando o sinal % na frente dos especificadores de


formato de entrada, informa-se a scanf() que o tipo de
dado ser lido a seguir.

%c l um nico caracter
%d l um inteiro decimal
%i l um inteiro decimal
%e l um nmero de ponto flutuante
%f l um nmero de ponto flutuante
%h l um inteiro curto
%o l um nmero octal
%s l uma string
%x l um nmero hexadecimal
%p l um ponteiro
%n recebe um valor inteiro igual ao nmero de caracteres lidos
at o momento.

scanf()
by Prof. Edson Pedro Ferlin

Observaes (1)
1. Um caractere branco na string de controle faz com que scanf() passe por
cima de um ou mais caracteres brancos na string de entrada. Um caractere
branco um espao, um tab ou um \n. Em resumo, um caractere branco
na string de controle faz com que scanf() leia, mas no armazene,
qualquer nmero (incluindo o zero) de caracteres brancos, at o primeiro
caractere no-branco.

2. Um caractere no-branco na string de controle faz com que scanf() leia


e desconsidere um caractere coincidente. Por exemplo, "%d,%d" faz com
que scanf() primeiro leia um inteiro, depois leia e desconsidere uma vrgula
e, finalmente, leia um outro inteiro.

3. Todas as variveis usadas para receber valores por meio de scanf()


devem ser passadas por seus endereos. Isto significa que todos os
argumentos devem ser ponteiros para as variveis usadas como
argumentos.

4. No caso da leitura de strings para dentro de uma matriz de caracteres


endereo, usa-se: scanf("%s",endereo); pois neste caso endereo j
um ponteiro e no precisa ser precedido pelo operador &.

10

www.professorferlin.blogspot.com 5
scanf()
by Prof. Edson Pedro Ferlin

Observaes (2)
5. Deve-se separar dados de entrada usando espaos, tabs ou \n. Sinais
de pontuao como vrgula, ponto-e-vrgula e outros como separadores
no so considerados.

6. Um * colocado depois de % e antes do cdigo de formatao ler dados


do tipo especificado, mas suprimir suas atribuies. Logo, o comando
scanf("%d%*c%d",&x,&y); dada a entrada 10/20, coloca o valor 10
em x, desconsidera o sinal de diviso e atribui o valor 20 a y.

7. Os comandos de formatao podem especificar um modificador de


comprimento mximo de campo. Esse modificador um inteiro que
colocamos entre o % e o cdigo do comando de formatao que limita o
nmero de caracteres lidos para qualquer campo. Por exemplo, para limitar
a leitura de 20 caracteres para a string str, fazemos: scanf("%20s",
str); caso a fila de entrada seja maior que 20 caracteres, ento uma
chamada sub-sequente entrada comea onde essa chamada termina.

11

scanf()
by Prof. Edson Pedro Ferlin

Observaes (3)
8. Apesar de usar espaos, tabs e \n como separadores de campo, quando
se estiver lendo um nico caracter, o computador ler os separadores de
campo como qualquer outro caracter. Por exemplo, com uma fila de
entrada (x y), o scanf("%c%c%c",&a, &b, &c); retornar como
caractere x em a, um espao em b e o caractere y em c.

9. Qualquer outro caractere incluindo espaos, tabs e \n na string de


controle, o computador usar esses caracteres para combinar e descartar
caracteres da fila de entrada. O computador descartar qualquer caracter
coincidente. Por exemplo, entrada (10t20), o scanf("st%s", &x, &y);
atribuir x=10 , y=20, e t ser descartado. scanf("%s",nome); no
retornar at que se digita um caractere depois de digitar um caractere
branco. Isto acontece porque o espao depois de %s instrui scanf() para
ler e desconsiderar espaos, tabs e \n.

10. No se pode usar scanf() para exibir uma mensagem de aviso.


Portanto, exiba todos os avisos explicitamente antes de chamar scanf().

12

www.professorferlin.blogspot.com 6
Entrada e Sada
by Prof. Edson Pedro Ferlin

Funes mais utilizadas (stdio.h)

NOME FUNO

fopen() abre uma fila


fclose() fecha uma fila
putc() grava um caractere na fila
getc() l um caractere da fila
fseek() procura byte especificado em uma fila
fprintf() imprime fila
fscanf() l para fila
feof() devolve verdadeiro se a marca de EOF for alcanada
ferror() devolve verdadeiro se um erro tiver ocorrido
rewind() restabelece o localizador de posio no incio do arquivo.
remove() apaga um arquivo

13

Ponteiro do Arquivo
by Prof. Edson Pedro Ferlin

um ponteiro para a informao que define vrios aspectos


do arquivo, incluindo seu nome, status e posio corrente.

Um ponteiro de arquivo uma varivel do tipo FILE, que


definida em stdio.h.

14

www.professorferlin.blogspot.com 7
Funes com Arquivos
by Prof. Edson Pedro Ferlin

fopen() Parte 1

Esta funo abre uma fila de bytes para ser usada e liga
um arquivo a fila aberta.

Forma geral: FILE *fopen(char *nome_arquivo, char


*modo);

modo uma string que contm o status de abertura desejado.


nome_arquivo uma string que define o nome do arquivo.

Observao: pode-se abrir dois tipos de arquivos, um no


modo texto e outro no modo binrio.

15

Funes com Arquivos


by Prof. Edson Pedro Ferlin

fopen() Parte 2
Modo Significado
"r" abre um arquivo-texto para leitura (read)
"w" cria um arquivo-texto para gravao (write)
"a" anexa a um arquivo-texto (append)
"rb" abre um arquivo-binrio para leitura (read-binrio)
"wb" cria um arquivo-binrio para gravao (write-binrio)
"ab" anexa um arquivo binrio (append-binrio)
"r+" abre um arquivo texto para leitura/gravao
"w+" cria um arquivo-texto para leitura/gravao
"a+" abre ou cria um arquivo-texto para leitura/gravao
"r+b" abre um arquivo-binrio para leitura/gravao
"w+b" cria um arquivo-binrio para leitura/gravao
"a+b" abre um arquivo binrio para leitura/gravao
"rt" abre um arquivo texto para leitura (read-text)
"wt" cria um arquivo texto para gravao (write/text)
"at" anexa uma arquivo-texto (append-text)
"r+t" abre um arquivo-texto para leitura/gravao
"w+t" cria um arquivo-texto para leitura/gravao
"a+t" abre um arquivo-texto para leitura/gravao

16

www.professorferlin.blogspot.com 8
Funes com Arquivos
by Prof. Edson Pedro Ferlin

fopen() Parte 3
Exemplo: fp = fopen("A:\arq\teste.txt","w");

fp uma varivel do tipo FILE *, que o ponteiro do arquivo.

A notao mais usual escrita na forma :

if ( ( fp = fopen( "A:\arq\teste.txt","w") ) == NULL ) {


puts("NO POSSO ABRIR O ARQUIVO");
exit(1); }

Vantagem de detectar qualquer erro na abertura de


um arquivo, por exemplo: a tentativa de abrir um disco
protegido contra gravao ou um disco cheio, antes de
tentar gravar. Esse mtodo usa NULL, que zero, porque
nenhum ponteiro de arquivo ter aquele valor.

NULL uma macro definida em stdio.h.

17

Funes com Arquivos


by Prof. Edson Pedro Ferlin

fopen() Parte 4

1. A utilizao de fopen() na abertura de um arquivo para


gravao, criar um arquivo com o nome definido e se existir
qualquer arquivo preexistente com este nome ele o apagar.

2. Quando se deseja anexar outras informaes ao final do


arquivo, usamos o modo a. Quando se utiliza o modo a e o
arquivo no existe, o computador devolver um erro.

3. A abertura de um arquivo para operaes de leitura, requer


que o arquivo exista. Se no existir, fopen() devolver um erro.

4. Quando se abre um arquivo para as operaes


leitura/gravao, o computador no apagar se ele existir; e se
ele no existir, o computador criar.

18

www.professorferlin.blogspot.com 9
Funes com Arquivos
by Prof. Edson Pedro Ferlin

putc()
usada para gravar caracteres em uma fila previamente
aberta para gravao por meio da funo fopen().

Forma geral: int putc (int ch, FILE *fp);

fp o ponteiro do arquivo devolvido por fopen();


ch o caractere a ser gravado (usa apenas um byte);

Exemplo: putc(ch,fp);

Observaes:
1. O ponteiro do arquivo informa a putc() em qual arquivo em disco
gravar.

2. Se uma gravao putc() for bem-sucedida, ento ela devolver o


caractere gravado, caso contrrio, devolver um EOF(end-of-file).

19

Funes com Arquivos


by Prof. Edson Pedro Ferlin

getc() Parte 1

usada para ler caracteres de uma fila que fopen() abriu no


modo de leitura.

Forma geral: int getc(FILE *fp);

fp um ponteiro de arquivo do tipo FILE;


Devolve um inteiro, mas o byte de ordem superior zero.

Observaes :
1. A funo getc() devolve uma marca EOF quando alcana o final
de arquivo. Logo, para ler um arquivo-texto at a marca de
fim de arquivo.
ch = getc(fp);
while (ch != EOF)
{
ch = getc(fp);
}

20

www.professorferlin.blogspot.com 10
Funes com Arquivos
by Prof. Edson Pedro Ferlin

getc() Parte 2

2. Quando se abre um arquivo para entrada binria,


possvel ler um valor inteiro igual a marca EOF. Se isto
acontecer, a rotina que se mostra indicar uma condio de fim
de arquivo, embora no tenha atingido o fim fsico do arquivo.
Para resolver este problema, utiliza-se a funo feof(); que
determina onde est a marca de fim de arquivo, quando da
leitura de arquivos de dados binrios. A funo feof() aceita um
argumento de ponteiros de arquivo, e retorna zero se no tiver
chegado ao fim do arquivo.

Exemplo: while (!feof(fp) ) ch = getc(fp);

Pode-se aplicar este mesmo mtodo a arquivos-textos.

21

Funes com Arquivos


by Prof. Edson Pedro Ferlin

fclose() Parte 1

usada para fechar uma fila que foi aberta com fopen().

Forma geral: int fclose(FILE *fp);

fp o ponteiro do arquivo devolvido pela fopen().

Exemplo: fclose(fp);

Observaes :

1. Um valor de retorno zero significa uma operao de fechamento bem-


sucedida.

2. Pode-se usar a funo ferror() para determinar e relatar problemas.

3. Geralmente, fclose() fracassar somente quando se remove um disquete


prematuramente ou quando no houver mais espao no mesmo.

22

www.professorferlin.blogspot.com 11
Funes com Arquivos
by Prof. Edson Pedro Ferlin

fclose() Parte 2
Observaes:

5. A funo fclose() grava em um arquivo os dados que ainda


permanecem no buffer do disco e efetua no arquivo um
fechamento formal a nvel do SO.

6. O fracasso em fechar uma fila um convite a todos os tipos de


problemas, incluindo perda de dados, destruio de arquivos e
possveis erros intermitentes no programa.

7. O uso de fclose() libera o bloco de controle do arquivo


associado a fila e torna-o disponvel para ser reutilizado.

8. O SO limita o nmero de arquivos abertos que se pode usar ao


mesmo tempo, portanto se pode fechar um arquivo antes de
poder abrir um outro.

23

Funes com Arquivos


by Prof. Edson Pedro Ferlin

ferror()

usada para determinar se uma operao de arquivo


produziu um erro.

Forma geral: int ferror(FILE *fp) ;

fp o ponteiro do arquivo vlido.

Exemplo: ferror(fp);

A funo ferror() retorna 1 se houver ocorrido um erro durante a


ltima operao de arquivo; devolve zero se a operao de
arquivo foi bem-sucedida.

24

www.professorferlin.blogspot.com 12
Funes com Arquivos
by Prof. Edson Pedro Ferlin

rewind()

usada para restabelecer o localizador de posio no


arquivo para o incio do arquivo especificado no seu
argumento.

Forma geral: void rewind(FILE *fp);

fp um ponteiro de um arquivo vlido.

Exemplo:
rewind(fp);

25

Funes com Arquivos


by Prof. Edson Pedro Ferlin

putw() e getw()

So usadas par ler e gravar inteiros de e para um


arquivo em disco. Estas funes no fazem parte do da
padronizao ANSI C. Elas trabalham exatamente como
putc() e getc() s que em vez de ler ou gravar um nico
caracter, putw() e getw() lem e gravam um inteiro.

Forma geral: int putw(int i, FILE *fp);

Forma geral: int getw(FILE *fp);

Exemplo :
putw(100, fp);
inteiro=getw(fp);

26

www.professorferlin.blogspot.com 13
Funes com Arquivos
by Prof. Edson Pedro Ferlin

fputs() e fgets()

So usadas par ler e gravar filas a partir de strings.

Forma geral: char fputs(char *str, FILE *fp);

Forma geral: char fgets(char *str, int tamanho, FILE


*fp);

A funo fputs() funciona como o puts(), s que ela


escreve a string em um fluxo especificado.
A funo fgets() l uma string de um fluxo
especificado at que um caractere de nova linha
seja lido ou tamanho-l caracteres tenham sido lidos.
Se uma nova linha lida, ela far parte da string (ao
contrrio do gets() ). A string resultante terminar com
nulo.

27

Funes com Arquivos


by Prof. Edson Pedro Ferlin

Funo fread() e fwrite()

So usadas para leitura e a escrita em blocos de dados.

Forma geral:

unsigned fread(void *buffer, int num_bytes, int count, FILE *fp);

unsigned fwrite(void *buffer, int num_bytes, int count, FILE *fp);

No caso da funo fread(), buffer um ponteiro para uma regio de


memria que receber dados lidos do arquivo. Para fwrite(),
buffer um ponteiro para a informao que ser escrita no
arquivo. O nmero de bytes para ler ou escrever especificado
por num_bytes. O argumento count determina quantos itens
(cada um tendo num_bytes de tamanho) sero lidos ou escritos.
Finalmente, fp um ponteiro para um arquivo de um fluxo
previamente aberto.

28

www.professorferlin.blogspot.com 14
Funes com Arquivos
by Prof. Edson Pedro Ferlin

Exemplo de Escrita em Arquivo

main()
{
FILE *fp;
float mat[100];
int i;
if( (fp=fopen("nome.dat","wb") ) ==NULL )
{
printf("Arquivo no pode ser aberto");
exit(1);
}
for( i=0; i<100; i++) mat[i] = (float) i; /* salvar a matriz inteira */
if( fwrite(mat, sizeof(mat),1,fp) != 1 ) printf("erro no arquivo");
fclose(fp);
}

29

Funes com Arquivos


by Prof. Edson Pedro Ferlin

Exemplo de Leitura de Arquivo

main() 000 ==> 000.0


{ 001 ==> 001.0
FILE *fp; 002 ==> 002.0
float mat[100]; 003 ==> 003.0
int i; .........................
095 ==> 095.0
if( (fp=fopen("nome.dat","rb") ) = =NULL )
096 ==> 096.0
{
097 ==> 097.0
printf("Arquivo no pode ser aberto"); 098 ==> 098.0
exit(1); 099 ==> 099.0
}
/* ler a matriz inteira */
if( fread(mat, sizeof(mat),1,fp) != 1 ) printf("erro no arquivo");
for( i=0; i<100; i++) printf("%03d ==> %05.1f\n",i, mat[i]);
fclose(fp);
}
30

www.professorferlin.blogspot.com 15
Funes com Arquivos
by Prof. Edson Pedro Ferlin

Acesso Aleatrio
Pode-se efetuar operaes de leitura e gravao aleatrias sob o
sistema de entrada e sada bufferizado com a ajuda da funo fseek(),
que ajusta o localizador de posio no arquivo.

Forma geral: int fseek(FILE *fp, long int num_bytes, int


origem);

fp um ponteiro para o arquivo retornado por uma chamada fopen();


um_bytes, que um inteiro longo, o nmero de bytes a partir da
origem, necessrios para se conseguir a posio corrente; e origem
uma das seguintes macros definidas em "stdio.h".

Origem Nome Valor atual


incio do arquivo SEEK_SET 0
posio corrente SEEK_CUR 1
fim do arquivo SEEK_END 2

Para procurar num_bytes do comeo do arquivo, origem deve ser


indicada como SEEK_SET. Para procurar da posio corrente, utiliza-se
SEEK_CUR; do final do arquivo, utiliza-se SEEK_END.

31

Funes com Arquivos


by Prof. Edson Pedro Ferlin

Acesso Aleatrio - Exemplo


O trecho de programa, mostra como ler o 235 byte do arquivo
x.dat.

FILE *fp;
char ch;
if( ( fp = fopen("x.dat","rb") ) == NULL )
{
printf("O arquivo no pode ser aberto\n");
exit(1);
}
fseek(fp, 234, 0);
ch = getc(fp) ; /* le um caractere na posio 235*/

32

www.professorferlin.blogspot.com 16
Funes com Arquivos
by Prof. Edson Pedro Ferlin

fprinf() e fscanf()
Estas funes se comportam exatamente como as funes
printf() e scanf(), s que operam em arquivos em
disco.

Forma geral:

int fprintf (FILE *fp , char *string_de_controle,


lista_argumentos);

int fscanf (FILE *fp , char *string_de_controle,


lista_argumentos);

Exemplo:
fscanf (stdin,%s %d, nome, &numero);
fprinf (stdin,%s %d\n, nome, numero);

33

Funes com Arquivos


by Prof. Edson Pedro Ferlin

remove()

Para apagar um arquivo especifico, utiliza-se a funo


remove().

Forma geral: int remove (char *nome_arquivo);

Exemplo:

if (remove(fp)==0) printf (Arquivo foi deletado com sucesso!\n);

34

www.professorferlin.blogspot.com 17

Das könnte Ihnen auch gefallen