Вы находитесь на странице: 1из 17

Aula 04/11/2015

Programao Estruturada II Tema: Manipulao de arquivos

Manipulao de Arquivos
1. Abertura de um arquivo (fopen)

Neste ponto tratamos a seguinte questo:


Como fazer que um arquivo em disco, que tem o seu nome externo ao
programa, seja associado a algum objeto ou varivel que interna ou
conhecida do nosso programa?
Antes que possa ser lido ou gravado um arquivo deve ser aberto pela funo
de biblioteca fopen. A funo fopen associa o nome de um arquivo externo ao
programa, como entrada.txt, a uma varivel do programa. Isto feito da
seguinte maneira:
FILE *arq_entrada;
. . .
arq_entrada = fopen("entrada.txt","r");
. . .

O primeiro parmetro da funo fopen uma cadeia de caracteres (string, seja


l o que for isto) contendo o nome do arquivo externo. J o segundo
parmetro, que tambm uma cadeia de caracteres, indica omodo como se
pretende usar o arquivo: leitura ("r"), gravao ("w"), anexao ("a"). Por
exemplo o comando
FILE *arq_entrada;
. . .
arq_entrada = fopen("entrada.txt","r");
if (arq_imagem == NULL)
{
printf("Um erro ocorreu ao tentar abrir o arquivo
`mamute.pgm'.\n");
}
. . .

associa a varivel arq_entrada do nosso programa o arquivo em disco de


nome entrada.txt. O arquivo entrada.txt deve estar na mesma pasta
(diretrio, folder) que o nosso programa, digamos, o ep3.exe. O arquivo
aberto para leitura ("r" de read). Se ocorrer um erro, como tentar
associar arq_entrada a um arquivo que no existe, fopen retorna o valor
representado pela constante NULL.
Se um arquivo que no existe no disco for aberto para escrita, ele criado. Por
exemplo, o seguinte trecho de cdigo cria um arquivo de nome: saida.txt.

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

FILE *arq_saida;
. . .
arq_saida = fopen("saida.txt","w");
if (arq_saida == NULL)
{
printf("Um erro ocorreu ao tentar criar o arquivo `saida.txt'\n");
}
. . .

O arquivo saida.txt criado na mesma pasta/diretrio que o arquivo que


contm o nosso programa, suponha que seja o ep3.exe. Se o arquivo j existe
ele destrudo e um novo arquivo com o mesmo nome criado. O arquivo
aberto para escrita ("w" de write).
Sempre que um erro ocorre durante a abertura de um arquivo o valor
devolvido pela funo fopen NULL.
2. Leitura de um arquivo (fscanf)

O prximo passo saber como ler os dados de uma arquivo. Considere o


arquivo entrada.txt que foi associado varivel arq_entrada do nosso
programa. O comando
FILE *arq_entrada;
. . .
arq_entrada = fopen("entrada.txt","r");
. . .
fscanf(arq_entrada,"%d", &num);
. . .

l um nmero inteiro do arquivo entrada.txt da mesma maneira que


. . .
scanf("%d", &num);
. . .

l um nmero digitado atravs do teclado. Na verdade, o comando


scanf("%d",&num);

uma abreviatura do comando


fscanf(stdin,"%d", &num);

onde stdin a entrada padro, que no nosso caso, o teclado.

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos
3. Escrita em arquivo (fprintf)

Para escrever-se em um arquivo de nome saida.txt pode-se usar os seguintes


comandos
FILE *arq_saida;
. . .
arq_saida = fopen("saida.txt","w");
. . .
fprintf(arq_saida,"Copia\n");
fprintf(arq_saida,"%d %d\n", n, m);
. . .

O primeiro fprintf escreve o texto "Copia\n" no arquivo saida.txt e o


segundo fprintf escreve o contedo da varivel n, um espaco (" "), o
contedo da varivel m e um barra-n ("\n") para mudar de linha.
Veja um exemplo um pouco mais elaborado:
FILE *arq_saida;
int n;
int m;
. . .
arq_saida = fopen("saida.txt","w");
if (arq_saida == NULL)
{
printf("Um erro ocorreu ao tentar criar o arquivo
`saida.txt'.\n");
}
. . .
fprintf(arq_saida,"Copia\n");
fprintf(arq_saida,"%d %d\n", n, m);
fprintf(arq_saida,"n*m=%d\n", n*m);
. . .

De maneira semelhante ao que ocorre com o scanf, o comando


printf("%d\n", valmax);

uma abreviatura do comando


fprintf(stdout,"%d\n", valmax);

onde stdout a sada padro, que no nosso caso, a tela do monitor.


4. Fechamento de um arquivo (fclose)

A funo fclose encerra a associao estabelecida pelo programa entre uma


varivel e o nome externo do arquivo. O fclose tambm libera os recursos

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

do sistema que controlam a manipulao do arquivo em disco. A chamada


abaixo fecha o arquivo associado varivel arq_saida.
fclose(arq_saida);

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos
Exemplo de programa usando funes com e sem retorno.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

#include<stdio.h>
#include<conio.h>
/******* rea dos prottipos ******/
void imprime_cabec(void);
int multiplica(int N1, int N2);
/******* fim dos prottipos *******/
/* ******* FUNO PRINCIPAL *******/
int main(void)
{
int V1=0, V2=0, resultado=0;
//Chamada da funo imprime_cabec
imprime_cabec();
printf("Digite o primeiro valor:");
scanf("%d", &V1);
printf("Digite o segundo valor:");
scanf("%d", &V2);
//chama a funo e recebe o retorno
resultado = multiplica(V1,V2);
printf("Resultado = %d\n", resultado);
getch();
return 0;
}
/* ******** FIM DA FUNO PRINCIPAL *******/
/* --------- Corpo das funes --------- */
/*
***** Funo imprime_cabec *****
Parmetros de entrada: no tem (void)
Objetivo: imprimir cabealho na tela
Tipo de retorno: no tem (void)
*/
void imprime_cabec(void)
{
printf("******************************\n");
printf("*
LINGUAGEM C
*\n");
printf("******************************\n\n");
return;/* retorno de uma funo void

*/

}
/*
***** Funo multiplica *****
Parmetros de entrada: N1, N2 ambos int
Objetivo: multiplicar valores
Tipo de retorno: int (resultado);
*/
//multiplica recebe N1,N2 e retorna um int
int multiplica(int N1, int N2)
{
int resultado;
resultado = N1 * N2;

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

48
49
50
51
52
53
54
55
56
57
58
59
60

//retornando o valor para main


return(resultado);
}

Definio
Conjunto de comandos agrupados em um bloco
que recebe um nome e atravs deste pode ser
ativado.

Porque usar funes ?

Para permitir o reaproveitamento de cdigo j


construdo(por voc ou por outros
programadores);
Para evitar que um trecho de cdigo que seja
repetido vrias vezes dentro de um mesmo
programa;
Para permitir a alterao de um trecho de
cdigo de uma forma mais rpida. Com o uso de
uma funo preciso alterar apenas dentro da
funo que se deseja;
Para que os blocos do programa no fiquem
grandes demais e, por conseqncia, mais
difceis de entender;
Para facilitar a leitura do programa-fonte de uma
forma mais fcil;

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

Para separar o programa em partes(blocos) que


possam ser logicamente compreendidos de
forma isolada.

Primero Exemplo
Em primeiro lugar, imaginemos que voc
necessite vrias vezes em seu programa imprimir a
mensagem "Pressione a tecla ENTER" e esperar
que o usurio tecle ENTER, caso o usurio tecle
algo diferente o programa deve imitir um BEEP.
Voc pode fazer um lao de WHILE sempre
que isto fosse necessrio.
Uma alternativa criar uma funo. Com o uso
de funes, este processo de repetio fica
simplificado. Observe o exemplo a seguir.
#include <stdio.h>
void EsperaEnter() // Definio da
funo "EsperaEnter"
{
int tecla;
printf("Pressione ENTER\n");
do
{
tecla = getchar();
if (tecla !=13) // Se nao for
ENTER
{

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

printf("Digite ENTER\n");
}
} while(tecla != 13); // 13 e' o
codigo ASCII do ENTER
}
void main()
{
EsperaEnter();
funo definida antes
// ...........
EsperaEnter();
funo definida antes
// ...........
EsperaEnter();
funo definida antes
}

// Chamada da
// Chamada da
// Chamada da

Formato Geral de uma Funo em C


tipo_da_funcao NomeDaFuncao (Lista_de_Parametro
s)
{
// corpo da funo
}

A Lista_de_Parametros, tambm chamada


de Lista_de_Argumentos, opcional.

Parmetros
A fim de tornar mais amplo o uso de uma
funo, a linguagem C permite o uso

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

de parmetros. Este parmetros possibilitam que se


definida sobre quais dados a funo deve operar. A
funo sound(freq), por exemplo, recebe como
parmetro a freqncia do som a ser gerado,
permitindo que se defina seu comportamento a partir
deste valor.
Para definir os parmetros de uma funo o
programador deve explicit-los como se estive
declarando uma varivel, entre os parnteses do
cabealho da funo. Caso precise declarar mais de
um parmetro, basta separ-los por vrgulas. No
exemplo a seguir temos a funo SOMA que possui
dois parmetros, sendo o primeiro um float e o
segundo um int.
void SOMA(float a, int b) // basta
separar por vrgulas
{
float result;
// a declarao de
variveis igual ao que
// se faz na
funo main
result = a+b;
printf("A soma de %6.3f com %d
%6.3f\n, a,b,Result);
}
Os parmetros da funo na sua declarao
so chamados parmetros formais. Na chamada
da funo os parmetros so chamados parmetros
atuais/reais.
Os parmetros so passados para uma funo
de acordo com a sua posio. Ou seja, o primeiro

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

parmetro atual(da chamada) define o valor o


primeiro parmetro formal (na definio da funo, o
segundo parmetro atual define o valor do segundo
parmetro formal e assim por diante. Os nomes dos
parmetros na chamada no tem relao com os
nomes dos parmetros na definio da funo.
No cdigo a seguir, por exemplo, a funo
SOMA chamada recebendo como parmetros as
variveis "b" e "a", nesta ordem.
#include <stdio.h>
void SOMA(float a, int b) // basta
separar os parmetros por vrgulas
{
float result;
// a declarao de
variveis igual ao que
// se faz na
funo main
result = a+b;
printf("A soma de %d com %6.3f
%6.3f\n, a,b,Result);
}
void main()
{
int a;
float b;
a = 10;
b = 12.3;
SOMA(b,a);
SOMA(12.3,10)
}

// Chamada da funo

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

O resultado do programa a impresso da


seguinte mensagem: A soma de 12.300 com 10 22.300

Localizao das Funes no Fonte


A princpio podemos tomar com regra a
seguinte afirmativa toda funo deve
ser declarada antes de ser usada.
A declarao de uma funo em linguagem C
no exatamente o que fizemos at agora. O que
estamos fazendo a definio da funo antes de
seu uso. Na definio da funo est implcita
a declarao.
Alguns programadores preferem que o incio do
programa seja a primeira parte de seu programa.
Para isto a linguagem C permite que se declare uma
funo, antes de defini-la. Esta declarao feita
atravs do prottipo da funo. O prottipo da
funo nada mais do que o trecho de cdigo que
especifica o nome e os parmetros da funo.
No exemplo a seguir a
funo SOMA prototipada antes de ser usada e
assim pde ser chamada antes de ser definida.
#include <stdio.h>
void SOMA(float a, int
b); // Prottipo da funo SOMA
void main()

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

{
SOMA(16.7,15); // Chamada da
funo SOMA antes de sua definio,
}
//
mas aps sua prototipao
void SOMA(float a, int b) // Definio
da funo SOMA
{
float result;
// a declarao de
variveis igual ao que
// se faz na
funo main
result = a+b;
printf("A soma de %d com %6.3f
%6.3f\n, a,b,Result);
}
Ateno: existem compiladores mais simplificados
ou antigos que no obrigam a declarao da
funoantes de seu uso !!! Muito cuidado com eles !!
Veja no item a seguir.

Verificao dos Tipos dos


Parmetros
A princpio, dados usados parmetros
atuais(aqueles da chamada da funo) devem ser
dos mesmos tipos dos parmetros formais. Se isto
no ocorrer, mas a declarao da funo vier antes
de seu uso, os compiladores C modernos se

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

encarregam de converter automaticamente os tipos


como se estivesemos usando um CAST.
Entretanto, tenha muito cuidado se as trs
condies a seguir se verificarem:

se voc estiver usando um compilador


que no exige a declarao antes da
funo antes de seu uso;
se voce usar uma funo antes de t-la
prototipado(declarado);
se os parmetros formais e reais no
forem exatamente do mesmo tipo

Se as trs condies se verificarem o resultado


da execuo da funo mprevisvel !
No caso de voc declarar corretamente a
funo antes de us-la, a converso de tipos feita
como no caso de variveis. No exemplo a seguir a
funo SOMA chamada com os parmetros reais
dos tipos int e float, nesta ordem. Como na
declarao da funo o primeiro par6ametro
float e o segundo int, feita uma converso
de int para float no caso do primeiro parmetro e
de float para int no caso do segundo parmetro.
#include <stdio.h>
void SOMA(float a, int b);
SOMA
void main()
{
float f;
f = 20.7

// Prottipo da funo

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

SOMA(16,f);
}

Neste exemplo o primeiro parmetro


convertido para 16.0 e o segundo para 20. O que
ocorre, de fato, que a chamada da funo feita
como se mesma fosse substituda por:
SOMA((float)16,(int)f);

Escopo de Variveis
Por escopo de uma varivel entende-se o
bloco de cdigo onde esta varivel vlida. Com
base nisto, temos as seguintes afirmaes:

As variveis valem no bloco que so definidas;


as variveis definidas dentro de uma funo
recebem o nome de variveis locais;
os parmetros formais de uma funo valem
tambm somente dentro da funo;
uma varivel definida dentro de uma funo no
acessvel em outras funes, MESMO ESTAS
VARIVEIS TENHAM NOME IDNTICOS.

No trecho de cdigo a seguir tem-se um


exemplo com funes e variveis com nomes iguais.
#include <stdio.h>
void FUNC1()
{
int B;
B = -100;
printf("Valor de B dentro da funo FUNC1: %d\n", B);
}
void FUNC2()
{
int B;

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

B = -200;
printf("Valor de B dentro da funo FUNC2: %d\n", B);
}

void main()
{
int B;
B = 10;
printf("Valor de B: %d\n", B);
B = 20;
FUNC1();
printf("Valor de B: %d\n", B);
B = 30;
FUNC2();
printf("Valor de B: %d\n", B);
getch();
}

SADA
Valor de B: 10
Valor de B dentro da funo FUNC1: -100
Valor de B: 20
Valor de B dentro da funo FUNC2: -200
Valor de B: 30

Aula 04/11/2015
Programao Estruturada II Tema: Manipulao de arquivos

Exerccios com funo


1) Funo preencher Vetor, imprimir o Vetor, imprimir o quadrado, imprimir o primeiro e
o ltimo nmero.

2) Criar uma funo que receba um caractere como parmetro e retorne 1 (um) caso seja
uma vogal e zero caso no seja.
#include <string.h>
#include <math.h>
int verificavogal (char M) {
if(M=='a' || M=='A' || M=='e' || M=='E' || M=='i' || M=='I' || M=='o' || M=='O' || M=='u' || M=='U')
return(1);
else return(0);
}
main() {
char x;
printf("Digite uma letra: "); scanf("%c",&x);
if(verificavogal(x)==1)
printf("\nA letra [ %c ] eh uma vogal: ",x);
else
printf("\nA letra [ %c ] eh uma constante: ",x);

Вам также может понравиться