Baixe o app para aproveitar ainda mais
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
Compartilhar