Buscar

Prog I - Aula 9: arquivos

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Arquivos
INF1005 – Programação I – 33B
Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br 
1
arquivos
tópicos
por que usar arquivos
manipulação de arquivos
lendo dados de arquivos (modo texto)lendo dados de arquivos (modo texto)
escrevendo dados em arquivos (modo texto)
referência
Capítulo 6 da apostila
Capítulo 15 do livro
2
por que utilizar arquivos
armazenar permanentemente dados
e.g., que tenham sido digitados por alguém ou que estejam em
arquivos num formato diferente do desejado
processar dados de diferentes maneiras
(transformando-os, combinando-os, gerando novos(transformando-os, combinando-os, gerando novos
etc.)
e.g., a partir das notas dos alunos de uma turma, calcular as 
suas médias (e, possivelmente, gerar um novo arquivo)
3
como manipular arquivos
leitura
abrir o arquivo para leitura (read)
ler os dados no formato em que foram escritos
fechar o arquivo
escrita
abrir o arquivo para escrita (write)
escrever os dados no formato desejado
fechar o arquivo
4
leitura de 
arquivo
fopen: abrindo arquivo para leitura
#include <stdio.h> /* biblioteca de entrada e saída */
...
FILE* fpIn; /* ponteiro para estrutura de arquivo */
...
fpIn = fopen("arquivoEntrada.txt", "r"); /* abre arquivo para leitura (r: read)*/
...
/* lê e processa dados */
...
fclose(fpIn); /* fecha arquivo */
6
Se o arquivo não existir ou não puder ser aberto para leitura, 
fopen retorna NULL.
fopen: abrindo arquivo para leitura
#include <stdio.h> /* biblioteca de funções de entrada e saída */
#include <stdlib.h> /* biblioteca padrão */
int main(void) {
FILE* fpIn; /* ponteiro para estrutura de arquivo */
/* abre arquivo (que deve existir) para leitura (r: read)*/
fpIn = fopen("arquivoEntrada.txt", "r");
if (fpIn == NULL) /* verifica se arquivo pôde ser aberto */
{
printf("Erro na abertura do arquivo de entrada.\n");
exit(1); /* aborta o programa (função da biblioteca padrão) */
}
… /* lê e processa conteúdo do arquivo */
fclose(fpIn); /* fecha arquivo */
return 0;
}
7
Se o arquivo não existir ou não puder ser aberto para leitura, 
fopen retorna NULL.
fscanf: lendo dados de arquivo
#include <stdio.h>
int main(void) {
FILE* fpIn;
float p1, p2, p3;
int mat;
fpIn = fopen("notas.txt", "r"); /* abre para leitura */
if (fpIn == NULL) { /* verifica se arquivo foi aberto */
8
printf("Erro.\n"); 
return 1;
}
/* lê número de matrícula e notas de cada aluno do arquivo de entrada */
/* (no final do arquivo, fscanf retorna EOF (-1)) */
while (fscanf(fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4)
/* escreve matrícula e média de cada aluno na tela */
printf("%d %.1f\n", mat, (p1+p2+p3)/3);
/* fecha arquivo de entrada */
fclose(fpIn);
return 0;
}
fscanf: lendo dados de arquivo
#include <stdio.h>
int main(void) {
FILE* fpIn;
float p1, p2, p3;
int mat;
fpIn = fopen("notas.txt", "r");
if (fpIn == NULL) {
printf("Erro.\n"); return 1;
}
while (fscanf(fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4)
1013217 10.0 9.9 9.7
1013101 5.0 8.0 9.5
1013105 9.5 8.9 9.7
arquivo “notas.txt”
2
3
4
5
indica posição atual no arquivo
1
9
while (fscanf(fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4)
printf("%d %.1f\n", mat, (p1+p2+p3)/3);
fclose(fpIn);
return 0;
}
1. fopen abre arquivo para leitura
2. fscanf lê mat=1013217, p1=10.0, p2=9.9, p3=9.7 e retorna 4 →
entra no loop e exibe matrícula e média
3. fscanf lê mat=1013101, p1=5.0, p2=8.0, p3=9.5 e retorna 4 →
entra no loop e exibe matrícula e média
4. fscanf lê mat=1013105, p1=9.5, p2=8.9, p3=9.7 e retorna 4 →
entra no loop e exibe matrícula e média
5. fscanf não consegue ler do arquivo e retorna -1 (EOF: end of file)→ sai do loop, ...
6
EX. 01
#include <stdio.h>
int main(void) {
FILE* fpIn;
float p1, p2, p3;
int mat;
fpIn = fopen("notas.txt", "r"); /* abre para leitura */
Modifique o programa anterior para ler 3 ou 4 notasler 3 ou 4 notasler 3 ou 4 notasler 3 ou 4 notas, dependendo 
da média das 3 primeiras, e exibir a média. Lembrando: caso o 
aluno precise fazer P4, a média final é a média aritmética das suas 
3 maiores notas.
10
if (fpIn == NULL) { /* verifica se arquivo foi aberto */
printf("Erro.\n"); 
return 1; 
}
/* lê número de matrícula e notas de cada aluno do arquivo de entrada */
while (fscanf(fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4)
/* escreve matrícula e média de cada aluno na tela */
printf("%d %.1f\n", mat, (p1+p2+p3)/3);
/* fecha arquivo de entrada */
fclose(fpIn);
return 0;
}
Modifique o programa anterior para ler 3 ou 4 notas, 
dependendo da média das 3 primeiras, e exibir a média.
LembrandoLembrandoLembrandoLembrando: : : : casocasocasocaso o o o o alunoalunoalunoaluno precise precise precise precise fazerfazerfazerfazer P4, a P4, a P4, a P4, a médiamédiamédiamédia final é a final é a final é a final é a médiamédiamédiamédia
aritméticaaritméticaaritméticaaritmética das das das das suassuassuassuas 3 3 3 3 maioresmaioresmaioresmaiores notasnotasnotasnotas....
Como ler três valores e depois mais um, se necessário?
1. lê três valores
2. calcula a média
3. se a média < 5.0, lê quarto valor
EX. 01
11
while (fscanf(fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4) {
media = (p1+p2+p3)/3;
if (media < 5.0) {
fscanf(fpIn, "%f ", &p4);
/* calcula a nova média */
...
}
printf("%d %.1f\n", mat, media);
}
Modifique o programa anterior para ler 3 ou 4 notas, 
dependendo da média das 3 primeiras, e exibir a média.
LembrandoLembrandoLembrandoLembrando: : : : casocasocasocaso o o o o alunoalunoalunoaluno precise precise precise precise fazerfazerfazerfazer P4, a P4, a P4, a P4, a médiamédiamédiamédia final é a final é a final é a final é a médiamédiamédiamédia
aritméticaaritméticaaritméticaaritmética das das das das suassuassuassuas 3 3 3 3 maioresmaioresmaioresmaiores notasnotasnotasnotas....
Como calcular a nova média (com a P4)?
Que tal: somar todas as quatro notas (P1 a P4), e depois 
subtrair a menor das outras três?
Como descobrir a menor de três notas?
Problema mais simples: descobrir a menor de duas notas
EX. 01
Problema mais simples: descobrir a menor de duas notas
Utilizando a função acima, como descobrir a menor de três notas?
12
float menor (float a, float b) 
{
if (a < b)
return a;
return b;
}
nota_menor = menor(P1, menor(P2, P3));
EX. 01
#include <stdio.h>
int main(void) {
FILE* fpIn;
float p1, p2, p3, p4, media;
int mat;
fpIn = fopen("notas.txt", "r");
Modifique o programa anterior para ler 3 ou 4 notas, dependendo
da média das 3 primeiras, e exibir a média. Lembrando: caso o 
aluno precise fazer P4, a média final é a média aritmética das suas
3 maiores notas.
13
if (fpIn == NULL) { printf("Erro.\n"); return 1; }
while (fscanf(fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4) {
media = (p1+p2+p3)/3;
if (media < 5.0) {
fscanf(fpIn, "%f ", &p4);
media = (p1 + p2 + p3 + p4 – menor(p1, menor(p2, p3)))/3;
}
printf("%d %.1f\n", mat, media);
}
fclose(fpIn);
return 0;
}
dúvidas?dúvidas?
escrita em 
arquivo
fopen: abrindo arquivo para escrita
#include <stdio.h> /* biblioteca de funções de entrada e saída */
#include <stdlib.h> /* biblioteca padrão */
int main(void) {
FILE* fpOut; /* ponteiro para estrutura de arquivo */
/* abre arquivo para escrita (w: write) */
fpOut = fopen("arquivoSaida.txt", "w");
if (fpOut == NULL)
{
printf("Erro na abertura do arquivode saida.\n");
exit(1); /* aborta o programa */
}
... /* escreve no arquivo */
fclose(fpOut); /* fecha o arquivo */
return 0;
}
16
Se o arquivo não puder ser aberto para escrita, fopen retorna NULL.
Se o arquivo já existir, será sobrescrito.
fprintf: escrevendo dados em arquivo
#include <stdio.h>
int main(void) {
FILE *fpOut;
float p1, p2, p3;
int mat;
fpOut = fopen("notas.txt", "w"); /* abre para escrita*/
if (fpOut == NULL) { /* verifica se arquivos puderam ser abertos */
printf("Erro.\n"); 
return 1;
}
while (1) {while (1) {
printf("Digite o numero de matricula (0 para terminar): ");
scanf("%d", &mat);
if (mat <= 0) break;
printf("Digite as notas da P1, P2 e P3: ");
scanf("%f %f %f", &p1, &p2, &p3);
/* escreve os dados de cada aluno no arquivo de saída */
fprintf (fpOut, "%d %.1f %.1f %.1f\n", mat, p1, p2, p3);
}
fclose (fpOut); /* fecha arquivo de saída */
return 0;
}
17
fprintf: lendo e escrevendo dados em
arquivo#include <stdio.h>
int main(void) {
FILE *fpIn, *fpOut;
float p1, p2, p3;
int mat;
fpIn = fopen("notas.txt", "r"); /* abre para leitura */
fpOut = fopen("medias.txt", "w"); /* abre para escrita*/
if (fpIn == NULL || fpOut == NULL) { /* verifica se arquivos puderam ser abertos */
printf("Erro.\n"); printf("Erro.\n"); 
return 1;
}
/* lê número de matrícula e notas de cada aluno do arquivo de entrada */
while (fscanf (fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4)
/* escreve matrícula e média de cada aluno no arquivo de saída */
fprintf (fpOut, "%d %.1f\n", mat, (p1+p2+p3)/3);
/* fecha arquivos de entrada e de saída */
fclose (fpIn);
fclose (fpOut);
return 0;
}
18
Modifique o programa anterior para, além da média do 
aluno, escrever a situação final do aluno:
AP, caso ele esteja aprovado (média >= 5) 
RM, caso ele esteja reprovado
EX. 02
#include <stdio.h>
int main(void) {
FILE *fpIn, *fpOut;
float p1, p2, p3;
int mat;
fpIn = fopen("notas.txt", "r"); /* abre para leitura */
fpOut = fopen("medias.txt", "w"); /* abre para escrita*/
19
fpOut = fopen("medias.txt", "w"); /* abre para escrita*/
if (fpIn == NULL || fpOut == NULL) {
printf("Erro.\n"); return 1;
}
/* lê número de matrícula e notas de cada aluno do arquivo de entrada */
while (fscanf (fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4)
/* escreve matrícula e média de cada aluno no arquivo de saída */
fprintf (fpOut, "%d %.1f\n", mat, (p1+p2+p3)/3);
fclose (fpIn); /* fecha arquivos de entrada e de saída */
fclose (fpOut);
return 0;
}
Modifique o programa anterior para, além da média do 
aluno, escrever a situação final do aluno:
AP, caso ele esteja aprovado (média >= 5) 
RM, caso ele esteja reprovado
EX. 02
#include <stdio.h>
int main(void) {
FILE *fpIn, *fpOut;
float p1, p2, p3, media;
int mat;
fpIn = fopen("notas.txt", "r"); /* abre para leitura */
fpOut = fopen("medias.txt", "w"); /* abre para escrita*/
if (fpIn == NULL || fpOut == NULL) {
Por que não escrever o seguinte?
if (media < 5.0)
fprintf(fpOut, "%d %.1f RM\n", mat, media);
else
fprintf(fpOut, "%d %.1f AP\n", mat, media);
20
if (fpIn == NULL || fpOut == NULL) {
printf("Erro.\n"); return 1;
}
while (fscanf (fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4) {
media = (p1 + p2 + p3) / 3;
fprintf (fpOut, "%d %.1f ", mat, media);
if (media < 5.0)
fprintf(fpOut, "RM\n");
else
fprintf(fpOut, "AP\n");
}
fclose (fpIn); fclose (fpOut);
return 0;
}
modos de 
abertura de abertura de 
arquivo
r = read, w = write, a = append
FILE *fp1, *fp2, *fp3;
fp1 = fopen("notas.txt", "r"); /* abre para leitura */
fp2 = fopen("medias.txt", "w"); /* abre para escrita*/
fp3 = fopen("log.txt", "a"); /* “append” */
/* modo “append”:
*
* Caso o arquivo não exista, cria para escrita.
* Caso o arquivo exista, continua a escrita a partir
* do final do arquivo.
*/
22
fgets: lendo uma linha inteira
#include <stdio.h>
#define MAXBUFFERSIZE 1025
int main(void) {
char sBuffer[MAXBUFFERSIZE];
FILE *fp;
fp = fopen("alunos.txt", "r");
if (!fp) { printf("Erro ao abrir o arquivo.\n"); exit(1); }if (!fp) { printf("Erro ao abrir o arquivo.\n"); exit(1); }
while (!feof (fp))
{
fgets (sBuffer, MAXBUFFERSIZE, fp);
…
}
fclose(fp);
}
23
arquivos 
binários
24
Armazenando vetores em arquivos binários 
> escrita
void escreve_vetor(int n, float* vNotas) 
/* n: número de elementos no vetor vNotas */
{
FILE *fp = fopen("notas.dat", "wb"); /* abre o arquivo binário para escrita */
if (fp == NULL) /* verifica se o arquivo foi aberto */
{
printf("Erro ao abrir o arquivo para escrita.\n");
exit(1);exit(1);
}
fwrite(vNotas, sizeof(float), n, fp); /* escreve todo o vetor de uma vez */
fclose(fp); /* fecha o arquivo */
}
25
file pointer
número de elementos
tamanho de cada elemento
ponteiro para o vetor
Armazenando vetores em arquivos binários 
> leitura
int le_vetor(float* vNotas)
/* vetor vNotas deve ter espaço suficiente para todos os elementos no arquivo */
{
int num; /* número de elementos no arquivo */
long filesize; /* tamanho do arquivo */
FILE *fp = fopen("notas.dat", "rb"); /* abre um arquivo binário para leitura */
if (fp == NULL) /* verifica se o arquivo foi aberto */
{{
printf("Erro ao ler do arquivo.\n");
exit(1);
}
fseek(fp, 0, SEEK_END); /* vai para o final do arquivo */
filesize = ftell(fp); /* tamanho do arquivo = posição final */
num = filesize/sizeof(float); /* número de floats armazenados */
fseek(fp, 0, SEEK_SET); /* vai para o início do arquivo */
fread(vNotas, sizeof(float), num, fp); /* lê todos os elementos do vetor */
fclose(fp); /* fecha o arquivo de entrada */
return num; /* retorna número de elementos lidos */
}
26
ex09_06_vetor_arquivobin.c
dúvidas?dúvidas?
Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br

Continue navegando