Académique Documents
Professionnel Documents
Culture Documents
5etores e ponteiros
O nome_do_vetor utzado na decarao do vetor pode ser utzado tambm como
um pontero que aponta para o endereo da prmera poso do vetor.
O ndce dos cochetes podem ser nterpretados como uma expresso artmtca com
ponteros, da segunte forma: Se vet o nome de um vetor e tambm um pontero,
ento *vet o vaor armazenado na poso zero do vetor (sua 1a poso), ou se|a,
vet[0]. Da mesma forma, o eemento vet[i] equvaente a *(vet+i), ou se|a, o
vaor apontado peo apontador vet desocado de poses.
Esse conceto ser fundamenta para entender como a nguagem C mpementa
funes que acetam vetores como parmetros.
Exerc!cios (ecomendados
Escreva um programa que ea um ntero postvo m, os coecentes de um
ponmo rea p0 de grau n, trs reas x0, x1 e x2 e cacue p0(x0), p1(x1) e
p2(x2), onde p1 e p2 so respectvamente a prmera e a segunda dervada do
ponmo p0.
Dada uma seqnca de n nmeros nteros, determnar um segmento de soma
mxma. Exempo: Na seqnca 5, 2, -2, -7, 3A 1BA 1CA -3A D, -6, 4, 1 a soma do
segmento 33.
Dada uma seqnca de nmeros nteros, verque se exstem dos segmentos
consecutvos guas nesta seqnca, sto , se exstem e tas que:
Imprma, caso exstam, os vaores de e . Exempo: Na seqnca 7, 9, 5, 4, 5, 4, 8, 6
exstem e .
Eoza Sonoda
Eatri;es
(esumo:
Matrzes so estruturas b-dmensonas utzadas para armazenar dados de um
mesmo tpo. Para decarar uma matrz use a segunte construo:
tipo_da_matriz nome_da_matriz [num_linhas][num_colunas];
Para acessar os eementos da matrz, basta denr cada coordenada dese|ada
entre cochetes, ou se|a, use A||||| para acessar o eemento (,|) da matrz A.
Uma matrz pode ser consderada como um vetor de vetores, assm, o nome da
matrz, por exempo A, utzado para referencar toda a estrutura
bdmensona de A, mas cada nha da matrz pode ser utzada para
referencar uma couna (correspondente aos eementos da nha A||). Ouando
os dos ndces so fornecdos, ento acessamos um eemento da matrz. Ve|a
que dessa forma, no possve referencar uma couna dretamente.
Descrio:
Uma matrz uma estrutura bdmensona capaz de armazenar dados de um
mesmo tpo. Podemos consderar o conceto de matrz como uma extenso do
conceto de vetores, onde vetores correspondera a uma estrutura
undmensona. As matrzes (e vetores) s podem ser acessados atravs de
ndces nteros, ou se|a, a dmenso de uma matrz denda atravs de 2
nmeros, o nmero de nhas e o de counas. Na nguagem C, o prmero ndce
(escrto mas perto do nome da matrz) sempre corresponde nha, e o
segundo ndce, couna a ser acessada.
Como declarar uma matri;
Uma matrz deve ser decarada da segunte forma:
tipo_da_matriz nome_da_matriz [num_linhas][num_colunas];
Exempos:
int matInt [6][2]; /* matriz com 6 linhas e 2 colunas de
inteiros */
float matReal [5][7]; /* matriz com 5 linhas e 7 colunas de
floats */
char matChar [3][4]; /* matriz com 3 linhas e 4 colunas de
chars */
Observe que a decarao de matrzes semehante decarao de vetores,
porm necessro denr o tamanho da segunda dmenso. Na prmera
decarao, todos os eementos da matrz matInt so nteros. O prmero
nmero dene o nmero de nhas e o segundo o nmero de counas a serem
reservados na memra do computador para armazenar essa matrz. A segunda
decarao reserva uma matrz de oats, com 5 nhas e 7 counas.
Uma vez decarada, por exempo a matrz matChar com 3 nhas e 4 counas,
reservada uma rego na memra sucente para armazenar toda a matrz. A
gura abaxo mostra essa estrutura:
Lnha Couna Contedo Comentro
0 0 ? vaor nca
desconhecdo
0 1 ? vaor nca
desconhecdo
0 2 ? vaor nca
desconhecdo
0 3 ? vaor nca
desconhecdo
1 0 ? vaor nca
desconhecdo
1 1 ? vaor nca
desconhecdo
1 2 ? vaor nca
desconhecdo
1 3 ? vaor nca
desconhecdo
2 0 ? vaor nca
desconhecdo
2 1 ? vaor nca
desconhecdo
2 2 ? vaor nca
desconhecdo
2 3 ? vaor nca
desconhecdo
&igura 1: rea da memra reservada para a matrz matChar. Observe que so
reservadas 12 poses, cada uma das 3 nhas tem 4 counas.
Observe que a matrz pode ser consderada como um vetor de vetores, ou se|a,
a matrz um vetor de nhas, e cada nha um vetor de counas. Essa da
ser exporada nos exempos a segur.
Como usar matri;es em seus programas
Assm como vetores, cada poso da matrz funcona como uma varve, que
pode ser acessada atravs do nome da matrz e os ndces entre cochetes que
ndcam a coordenada dese|ada. Por exempo, o trecho de programa abaxo
cooca o caractere '*' em cada uma das poses do vetor matChar:
for (lin = 0; lin < 3; lin++)
for (col = 0; col < 4; col++)
/* lembre-se que um char deve vir entre apostrofes */
matChar[lin][col] = '*';
O ndce na verdade pode ser uma expresso, mas assm como vetores, tenha
sempre cudado de fornecer um ndce vdo.
Exemplos comentados
)(-FLEE# 1
Faa um programa que ea , e os eementos de uma matrz rea quadrada e
mprma quas nhas, counas e dagonas (prncpa e secundra) da matrz
so compostas apenas por zeros.
Souo (ve|a os comentros no prpro programa):
#include <stdio.h>
#define MAX 100
#define SIM 1
#define NAO 0
#define EPS 0.001
/*
funo saoIguais: compara se 2 numeros reais so iguais
devido a preciso numrica, dois reais NO devem ser comparados
diretamente para determinar igualdade
*/
int saoIguais(float f1, float f2) {
int res = NAO;
float dif = f1 - f2;
if (dif < EPS && dif > -EPS)
res = SIM;
return res;
}
int main () {
float A [MAX][MAX]; /* reservando espao para uma matriz MAX x
MAX */
int m, lin, col, soZero;
/* leitura dos dados */
printf("Entre com o tamanho da matriz quadrada: ");
scanf("%d", &m);
printf("Entre com os elementos da matriz\n");
for (lin=0; lin<m; lin++)
for (col=0; col<m; col++)
scanf("%f", &A[lin][col]);
/* verifica se existe alguma linha s com zeros */
for (lin = 0; lin < m; lin++) { /* para cada linha ... */
soZero = SIM; /* soZero um indicador de
passagem que */
for (col = 0; col < m; col++) /* muda de valor se a linha
conter algum */
if (saoIguais(A[lin][col], 0.0) NAO)
soZero = NAO; /* elemento diferente de zero */
if (soZero SIM) /* imprime a resposta parcial */
printf("A linha %d tem so zeros\n", lin);
}
/* verifica se existe alguma coluna s com zeros */
for (col = 0; col < m; col++) {
soZero = SIM;
for (lin = 0; lin < m; lin++)
if (saoIguais(A[lin][col], 0.0) NAO)
soZero = NAO; /* elemento diferente de zero */
if (soZero SIM)
printf("A coluna %d tem so zeros\n", col);
}
/* verifica diagonal principal */
soZero = SIM;
for (lin = 0; lin < m; lin++)
/* na diagonal, lin igual a col */
if (saoIguais(A[lin][lin], 0.0) NAO)
soZero = NAO;
if (soZero SIM)
printf("A diagonal principal tem so zeros\n");
/* verifica diagonal secundria */
soZero = SIM;
for (lin = 0; lin < m; lin++)
if (saoIguais(A[lin][m-1- lin], 0.0) NAO)
soZero = NAO;
if (soZero SIM)
printf("A diagonal secundaria tem so zeros\n");
return 0;
}
)(-FLEE# 2 - &%,01ES C-E E#.("GES:
O uso de matrzes em funes bem semehante ao uso de vetores, ou se|a,
sempre por refernca. Como exempo, vamos escrever um programa que
duas matrzes e cacua o seu produto, mas dessa vez, usando funes para er
e mprmr as matrzes.
Vamos prmero escrever uma funo que carrega uma matrz rea .
void leMatriz(float M[MAX][MAX], int m, int n) {
int lin, col;
for (lin=0; lin<m; lin++)
for (col=0; col<n; col++)
scanf("%f", &M[lin][col]);
}
Observe a deno da matrz como parmetro da funo leMatriz e que na
chamada da funo scanf, o endereo de cada eemento passado atravs de
&M[lin][col]). A dmenso das nhas na verdade facutatva, ou se|a, o
prottpo:
void leMatriz(float M![][MAX], int m, int n);
tambm vdo. Porm, a deno da segunda dmenso obrgatra, pos
caso contrro o compador no sera capaz de cacuar as poses corretas
dos eementos da matrz na memra (no sabera quantas counas puar para
chegar na prxma nha). Acredtamos que essa notao possa ser confusa no
nco, e portanto manteremos a notao que dene as duas dmenses.
Vamos agora escrever uma funo para mprmr uma matrz rea :
void imprimeMatriz(float M[MAX][MAX], int m, int n) {
int lin, col;
for (lin=0; lin<m; lin++) {
for (col=0; col<n; col++)
printf("%.2f \t", M[lin][col]);
printf("\n"); /* muda de linha */
}
}
Fnamente, vamos escrever o programa que mutpca duas matrzes:
#include <stdio.h>
#define MAX 100
void leMatriz(float M[MAX][MAX], int m, int n);
void imprimeMatriz(float M[MAX][MAX], int m, int n);
/* Seja A uma matriz de dimenso r x s e B uma matriz de
dimenso s x t. Esse programa calcula o produto de A x B,
resultando em uma matriz C de dimenso r x t
*/
int main () {
float A[MAX][MAX], B[MAX][MAX], C[MAX][MAX];
int r,s,t;
int lin, col, k;
float soma;
printf("Este programa calcula o produto de 2 matrizes\n");
printf("Digite as dimenses das matrizes: ");
scanf("%d %d %d", &r, &s, &t);
printf("Entre com os valores da matriz A\n");
leMatriz(A, r, s);
printf("Entre com os valores da matriz B\n");
leMatriz(B, s, t);
/* a matriz C tem r linhas e t colunas */
for (lin = 0; lin < r; lin++) {
for (col = 0; col < t; col++) {
/* calculo do produto da linha lin pela coluna col */
soma = 0;
for (k = 0; k<s; k++)
soma = soma + A[lin][k]*B[k][col];
C[lin][col] = soma;
}
}
/* vamos imprimir o resultado */
imprimeMatriz(C, r, t);
return 0;
}
Sabemos que um eemento da sada pode ser cacuado atravs da frmua:
Observe que h 3 comandos for encaxados. Dos dees so utzados para
vstar todos os eementos da sada (a matrz tem dmenso , e o tercero
utzado para cacuar o vaor da matrz em cada poso, varando .
Eatri;es e 5etores
Uma matrz pode ser consderada como um vetor de vetores, assm, o nome da
matrz (por exempo A) utzado para referencar toda a estrutura
bdmensona de A (ve|a, em partcuar, como a matrz A fo passada para as
funes leMatriz e imprimeMatriz dentro do programa anteror).
Mas com A um vetor de vetores, cada nha da matrz pode ser utzada para
referencar um vetor couna (a nha A|| um apontador para o nco do vetor
couna correspondente nha A||). Ouando os dos ndces so fornecdos,
ento acessamos um eemento da matrz. Ve|a que no possve referencar
uma couna dretamente como um vetor devdo a manera utzada para
armazenar uma matrz (ve|a a tabea 1), ou se|a, a matrz mantm a ordem
near dos eementos em uma nha, mas no mantm essa ordem para os
eementos de uma couna.
Vamos ver um exempo, usando o mesmo programa de produto de matrzes, e
a funo produtoEscalar vsto na aua sobre funes com vetores. Para sua
convennca, a funo produtoEscalar copada abaxo:
float produtoEscalar (float V1[MAX], float V2[MAX], int N) {
int i;
float res = 0;
for (i=0; i<N; i++)
res = res + V1[i] * V2[i];
return res;
}
Observe que o procedmento para mutpcar uma nha da matrz A por uma
couna da matrz B o mesmo procedmento do produto escaar. Sabendo que
cada nha da matrz pode ser consderado um vetor (mas no as counas), o
segunte programa cacua o produto de duas matrzes:
#include <stdio.h>
#define MAX 100
void leMatriz(float M[MAX][MAX], int m, int n);
void imprimeMatriz(float M[MAX][MAX], int m, int n);
float produtoEscalar (float V1[MAX], float V2[MAX], int N);
/* Seja A uma matriz de dimenso r x s e B uma matriz de
dimenso s x t. Esse programa calcula o produto de A x B,
resultando em uma matriz C de dimenso r x t
*/
int main () {
float A[MAX][MAX], B[MAX][MAX], C[MAX][MAX], vet[MAX];
int r,s,t;
int lin, col, k;
printf("Este programa calcula o produto de 2 matrizes\n");
printf("atraves do usa da funcao produtoEscalar \n");
printf("Digite as dimensoes das matrizes: ");
scanf("%d %d %d", &r, &s, &t);
printf("Entre com os valores da matriz A\n");
leMatriz(A, r, s);
printf("Entre com os valores da matriz B\n");
leMatriz(B, s, t);
/* a matriz C tem r linhas e t colunas */
for (lin = 0; lin < r; lin++) {
for (col = 0; col < t; col++) {
/* calculo do produto escalar da linha lin pela coluna col
*/
/* a linha pode ser passada diretamente, pois um vetor
*/
/* a coluna precisa ser carregada em um vetor auxiliar */
for (k = 0; k<s; k++) vet[k] = B[k][col];
/* repare agora como podemos chamar a funcao
produtoEscalar */
C[lin][col] = produtoEscalar(A[lin], vet, s);
}
}
/* vamos imprimir o resultado */
imprimeMatriz(C, r, t);
return 0;
}
Exerc!cios (ecomendados
Dzemos que uma matrz um quadrado atno de ordem se em cada nha e
em cada couna aparecem todos os nteros (ou se|a, cada nha e couna
permutao dos nteros ).
a) Escreva uma funo que recebe como parmetros um ntero n, um vetor V
com n nteros e verca se em V ocorrem todos os nteros de 1 a
n.
b) Usando a funo acma, verque se uma dada matrz ntera um
quadrado atno de ordem n.
a) Escreva uma funo que recebe como parmetros uma matrz rea , e uma
poso da matrz, e cacua a mda artmtca dos vznhos de ,
ou se|a, a mda entre , , e . Desconsdere os vznhos nas
dagonas e que no pertencem a matrz (por exempo, os vznhos
de (0, 0) so somente (0,1) e (1,0)).
b) Escreva uma funo que recebe como parmetro uma matrz rea e devove
uma matrz , onde a mda artmtca dos vznhos de (,|). Para
sto, utze a funo do tem anteror.
c) Escreva um programa que uma matrz rea , e um nmero ntero ;
utzando a funo do tem anteror, o programa deve transformar
a matrz vezes, mprmndo a matrz nca e depos de cada
transformao.
Eoza Sonoda
Cadeias de caracteres <strings=
Na nguagem C, uma ou string (ou cadeia de caracteres) um vetor de
caracteres em que o caractere nuo ('\0') nterpretado como m da parte
reevante do vetor. Exempo:
char *s;
s = malloc( 10 * sizeof (char));
s[0] = 'A';
s[1] = 'B';
s[2] = 'C';
s[3] = '\0';
s[4] = 'D';
Depos da execuo desse fragmento de cdgo, o vetor s[0..3] contm a
cadea de caracteres ABC. O caractere nuo marca o m dessa cadea. A poro
s[4..9] do vetor gnorada.
Comprimento e endereo
O comprimento (= length) de uma strng o seu nmero de caracteres, sem
contar o caractere nuo na.
O endereo de uma strng o endereo do seu prmero caractere, da mesma
forma que o endereo de um vetor o endereo de seu prmero eemento. Em
dscusses nformas, usua confundr uma strng com o seu endereo. Assm,
a expresso "consdere a strng s" deve ser entendda como "consdere a strng
cu|o endereo s".
Strings constantes
Para especcar uma strng constante, basta embruhar uma sequnca de
caracteres num par de aspas dupas. O caractere nuo na ca subentenddo.
Por exempo, "ABC" uma strng constante e o fragmento de cdgo
char *s;
s = "ABC";
equvaente ao que aparece na ntroduo desta pgna (exceto peo fato de
que a strng "ABC" ocupa apenas 4 bytes na memra). O prmero argumento
das funes printf e scanf, quase sempre uma strng constante. Por
exempo,
scanf( HIdH, &n);
printf( H- 3alor de n J IdH, n);
Exemplo: contagem de 3ogais
A funo abaxo conta o nmero de vogas em uma strng. A funo conta
apenas as vogas no acentuadas, mas muto fc modcar o cdgo para
que todas as vogas se|am contadas.
int contaVogais( char s[]) {
int numVogais, i;
char *vogais;
3ogais K Haeiou#E"-%HL
numVogais = 0;
for (i = 0; s[i] != '\0'; ++i) {
char ch;
int j;
ch = s[i];
for (j = 0; vogais[j] != '\0'; ++j) {
if (vogais[j] == ch) {
numVogais += 1;
break;
}
}
}
return numVogais;
}
Exerc!cios
Oua a dferena entre "A" e 'A'?
Oua a dferena entre "mno" e "m\no"? Oua a dferena entre "MNOP" e
"MN0P"? Oua a dferena entre "MN\0P" e "MN0P"?
Escreva uma funo que receba um caractere c e devova uma strng cu|o
nco caractere c.
Escreva uma funo que receba uma strng e mprma uma tabea com o
nmero de ocorrncas de cada caractere na strng. Escreva um
programa para testar a funo.
Escreva uma funo que decda se uma strng ou no um pandromo (ou
se|a, se o nverso da strng gua a ea). Escreva um programa para
testar a funo.
Escreva uma funo que receba strngs s e t e decda se s segmento de t
(ou se|a, se s pode ser obtda apagando um nmero arbtrro de
eementos do nco de t e um nmero arbtrro de eementos no m
de t). Escreva um programa que use a funo para contar o nmero de
ocorrncas de uma strng s em uma strng t.
|Sedg 3.60| Escreva uma funo que receba uma strng e substtua cada
segmento de dos ou mas espaos por um s caractere ' '.
Escreva uma funo que receba uma strng de 0s e 1s, nterprete essa strng
como um nmero em notao bnra e devova o vaor desse nmero.
# ?i?lioteca string
A bboteca padro string da nguagem C contm vras funes de
manpuao de strngs. Para usar essas funes, o seu programa deve ncur o
arquvo-nterface string.h:
#include <string.h>
No que segue, as strngs sero tratadas como um novo tpo-de-dados:
typedef char *string;
1$ A funo strlen (abrevatura de string length) recebe uma strng e devove
o seu comprmento. O cdgo dessa funo podera ser escrto assm:
unsigned int strlen( string s) {
int i;
for (i = 0; s[i] != '\0'; ++i) ;
return i;
}
2$ A funo strcpy (abrevatura de string cop() recebe duas strngs e copia a
segunda (ncusve o caractere nuo na) para o espao ocupado para a
prmera. O contedo orgna da prmera strng perddo. Antes de chamar a
funo, o programador deve certcar-se de que o espao aocado para
prmera strng sucente para acomodar a cpa da segunda. |Buher
overow uma das mas comuns orgens de bugs de segurana!| O cdgo
dessa funo podera ser escrto assm:
void strcpM( string s, string t) {
int i;
for (i = 0; t[i] != '\0'; ++i)
s[i] = t[i];
s[i] = '\0';
}
(Na verdade, o cdgo acma est geramente ncorreto, pos a funo strcpy
da bboteca string devove o endereo da prmera strng. Mas os usuros da
funo usuamente s esto nteressados no efeto da funo e no n'o que ea
devove.)
A funo strcpy pode ser usada para obter um efeto semehante ao do
exempo que abru esta pgna:
char s[10];
strcpy( s, "ABC");
3$ A funo strcmp (abrevatura de string compare) recebe duas strngs e
compara as duas excogracamente. Ea devove um nmero negatvo se a
prmera strng for excogracamente menor que a segunda, devove 0 se as
duas strngs so guas e devove um nmero postvo se a prmera strng for
excogracamente maor que a segunda.
Embora os parmetros da funo se|am do tpo char *, a funo se comporta
como se ees fossem do tpo unsigned char *. Assm, por exempo, "bb"
consderada excogracamente menor que "bb" e "ba" consderada
excogracamente menor que "b". O cdgo da funo podera ser escrto
assm:
int strcmp( string s, string t) {
int i;
unsigned char usi, uti;
for (i = 0; s[i] == t[i]; ++i)
if (s[i] == '\0') return 0;
usi = s[i]; uti = t[i];
return usi - uti;
}
Convm embrar que o vaor da expresso usi - uti cacuado em
artmtca int (e no mduo 256).
A ordem lexicogr6+ca entre strngs anoga ordem das paavras em um
dconro. Ea se basea na ordenao dos caracteres estabeecda na tabea
ISO8859-1, da mesma forma que a ordem das paavras em um dconro se
basea na ordenao das etras no afabeto. Para comparar duas strngs s e t,
procura-se a prmera poso, dgamos k, em que as duas strngs dferem. Se
s[k] vem antes de t[k] na tabea ISO ento s lexicogra)camente menor
que t. Se k no est dendo ento s e t so dntcas ou uma prexo
prpro da outra; nesse caso, a strng mas curta excogracamente menor
que a mas onga.
Exerc!cios
Dscuta as dferenas entre os trs fragmentos de cdgo a segur: char a[8],
b[8];
strcpy( a, "abacate");
strcpy( b, "banana");
char *a, *b;
a = malloc( 8); strcpy( a, "abacate");
b = malloc( 8); strcpy( b, "banana");
char *a, *b;
a = "abacate";
b = "banana";
O que h de errado com o segunte trecho de cdgo? char b[8], a[8];
strcpy( a, "abacate");
strcpy( b, "banana");
if (a < b)
printf( "%s vem antes de %s no dicionrio", a, b);
else
printf( "%s vem depois de %s no dicionrio", a, b);
O que h de errado com o segunte trecho de cdgo? char *b, *a;
a = "abacate";
b = "banana";
if (a < b)
printf( "%s vem antes de %s no dicionrio", a, b);
else
printf( "%s vem depois de %s no dicionrio", a, b);
O que h de errado com o segunte trecho de cdgo? char *a, *b;
a = "abacate";
b = "amora";if (*a < *b)
printf( "%s vem antes de %s no dicionrio", a, b);
else
printf( "%s vem depois de %s no dicionrio", a, b);
Escreva uma funo que receba uma strng s e um ntero no negatvo i e
devova o i-1-smo caractere de s, ou se|a, o caractere s[i].
Eloiza Sonoda
Object1
Manipulao de Arquivos
At agora, todos os programas feitos nesta disciplina lem dados do teclado (entrada
padro) e escrevem na tela do monitor (sada padro). Aqui mostrado como um
programa em C l dados de um arquivo que est no disco (HD ou DISQUETE) e
como grava um arquivo no disco. Um tratamento profundo do assunto, discutido
brevemente aqui, pode ser encontrado no livro:
The C programming language
Brian W. Kernigham e Dennis M. Ritchie
Prentice-Hall
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?
A regra clara (como diria o Armando Marques ) Antes que possa ser lido ou
gravado um arquivo deve ser aberto pela funo de biblioteca fopen. A
funo fopen associa o nome de uma 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 o modo 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 oorre! ao tentar a"rir o arq!i#o $mam!te.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 ep(.exe. O arquivo aberto
para leitura ("r" de read). Se ocorrer um erro, como tentar associararq_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
)aida.txt:
FILE *arq_)aida;
. . .
arq_)aida = fopen(")aida.txt","*");
if (arq_)aida == NULL)
{
printf("Um erro oorre! ao tentar riar o arq!i#o $)aida.txt%&n");
'
. . .
O arquivo )aida.txt criado na mesma pasta/diretrio que o arquivo que contm o
nosso programa, suponha que seja o ep(.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.
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");
. . .
f)anf(arq_entrada,"+d", ,n!m);
. . .
l um nmero inteiro do arquivo entrada.txt da mesma maneira que
. . .
)anf("+d", ,n!m);
. . .
l um nmero digitado atravs do teclado. Na verdade, o comando
)anf("+d",,n!m);
uma abreviatura do comando
f)anf()tdin,"+d", ,n!m);
onde )tdin a entrada padro, que no nosso caso, o teclado.
Escrita em arquivo (fprintf)
Para escrever-se em um arquivo de nome saida.txt pode-se usar os seguintes
comandos
FILE *arq_)aida;
. . .
arq_)aida = fopen(")aida.txt","*");
. . .
fprintf(arq_)aida,"-opia&n");
fprintf(arq_)aida,"+d +d&n", n, m);
. . .
O primeiro fprintf escreve o texto "-opia&n" no arquivo )aida.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_)aida;
int n;
int m;
. . .
arq_)aida = fopen(")aida.txt","*");
if (arq_)aida == NULL)
{
printf("Um erro oorre! ao tentar riar o arq!i#o $)aida.txt%.&n");
'
. . .
fprintf(arq_)aida,"-opia&n");
fprintf(arq_)aida,"+d +d&n", n, m);
fprintf(arq_)aida,"n*m=+d&n", n*m);
. . .
De maneira semelhante ao que ocorre com o scanf, o comando
printf("+d&n", #a.max);
uma abreviatura do comando
fprintf()tdo!t,"+d&n", #a.max);
onde )tdo!t a sada padro, que no nosso caso, a tela do monitor.
Fechamento de um arquivo (fclose)
A funo fclose encerra a associao estabelecida pelo programa entre uma varivel e
o nome externo do arquivo. O f.o)e tambm libera os recursos do sistema que
controlam a manipulao do arquivo em disco. A chamada abaixo fecha o arquivo
associado varivel arq_)aida.
f.o)e(arq_)aida);
Exemplo
A seguir est um exemplo de programa que copia nmeros de um arquivo de
nome origina..dat para um arquivo de nome opia.dat. O primeiro nmero do
arquivo origina..dat indica o nmero n de nmeros no arquivo.
/*
* 0rograma q!e q!e fa1 !ma opia de !m arq!i#o
* de nome origina..dat para !m arq!i#o de nome opia.dat. 2
* arq!i#o opia.dat fiara no me)mo diretorio do arq!i#o
* origina..dat.
*
*/
3in.!de 4)tdio.56
int main()
{
FILE *arq_o; /* a))oiado ao arq!i#o origina. */
FILE *arq_; /* a))oiado ao arq!i#o opia */
int n; /* n!mero de e.emento) do arq!i#o origina. */
f.oat x;
int i;
/* 7. a"ra arq!i#o origina..dat para .eit!ra */
arq_o = fopen("origina..dat","r");
if (arq_o == NULL)
{
printf("Erro na a"ert!ra do arq!i#o origina..dat.&n");
)8)tem("pa!)e"); /* para 9IN:29N; */
exit(<7); /* a"andona a exe!ao do programa */
'
/* =. a"ra arq!i#o opia.dat para e)rita */
arq_ = fopen("opia.dat","*");
if (arq_ == NULL)
{
printf("Erro na a"ert!ra do arq!i#o opia.dat.&n");
)8)tem("pa!)e"); /* para 9IN:29N; */
exit(<7); /* a"andona a exe!ao do programa */
'
/* (. .eia o taman5o da )eq!enia no arq!i#o origina..dat */
f)anf(arq_o,"+d", ,n);
/* >. e)re#a o n!mero de e.emento) no arq!i#o opia.dat */
fprintf(arq_,"+d&n", n);
/* ?. .eia o) n!mero) do arq!i#o origina..dat e e)re#a em opia.dat*/
for (i = @; i 4 n; iAA)
{
f)anf(arq_o,"+f", ,x);
fprintf(arq_,"+f ", x);
if (i == ?)
{ /* apena) ino n!mero) por .in5a de arq_ */
fprintf(arq_,"&n");
'
'
/* B. fe5e o arq!i#o origina..dat */
f.o)e(arq_o);
/* C. fe5e o arq!i#o opia.dat */
f.o)e(arq_);
ret!rn @;
'
Eloiza Sonoda
Object2