View
3
Download
0
Category
Preview:
Citation preview
Aula 26: Arquivos de textoIntrodução a Programação
Túlio Toffolo & Puca Huachihttp://www.toffolo.com.br
BCC201 – 2019/1Departamento de Computação – UFOP
Aulas anteriores
Estruturas heterogêneas
Alocação dinâmica (Parte 1)
2 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Aula de hoje
1 Arquivos
2 Biblioteca <stdio.h>
3 Exemplos
4 Exercícios
5 Próximas aulas
2 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Aula de hoje
1 Arquivos
2 Biblioteca <stdio.h>
3 Exemplos
4 Exercícios
5 Próximas aulas
2 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Arquivos
Podem armazenar grande quantidade de informação.
Mantém dados de forma persistente (gravado em disco).
Acesso aos dados pode ser não sequencial.
Acesso à informação pode ser concorrente.
3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Arquivos
Arquivo texto
Armazena caracteres seguindo uma codificação (utf-8, por exemplo).
Exemplo:
1 Este é um arquivo de texto, composto por caracteres...2 - abc3 - def...
Arquivo binário
Sequência de bits sujeita às convenções do programa que o gerou.
Exemplos: arquivos executáveis, compactados, de registros, etc.
4 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Aula de hoje
1 Arquivos
2 Biblioteca <stdio.h>
3 Exemplos
4 Exercícios
5 Próximas aulas
4 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
C fornece o tipo FILE para representar um arquivo.Na prática, usamos um ponteiro do tipo FILE.
Exemplo de declaração:
1 // arquivo para leitura2 FILE *entrada;34 // arquivo para gravação5 FILE *saida;
5 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
A função fopen é usada para abrir um arquivo e tem o seguinte protótipo:
1 FILE * fopen(const char *filename, const char *mode);
Note que a função tem 2 parâmetros:1 filename: nome do arquivo a ser aberto2 mode: modo de abertura do arquivo
"r" (read): leitura
"w" (write): gravação (sobrescreve o arquivo, se existir)
"r+" (read/update): leitura e gravação (arquivo tem que existir)
"w+" (write/read): leitura e gravação
"a+" (append/update): acrescenta dados no arquivo
6 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
Após abrir um arquivo, temos que fechá-lo com a função fclose.
1 int fclose(FILE *stream);
A função retorna 0 em caso de sucesso e EOF (-1) caso contrário.
7 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
Exemplos de uso de fopen e fclose:
1 // abrindo arquivo file.txt para leitura2 FILE *arquivo = fopen("file.txt", "r");3 ...4 fclose(arquivo);
1 // abrindo arquivo file.txt para gravação2 FILE *arquivo = fopen("file.txt", "w");3 ...4 fclose(arquivo);
1 FILE *arquivo;2 ...3 // abrindo arquivo file.txt no modo "append"4 arquivo = fopen("file.txt", "a+");5 ...6 fclose(arquivo);
8 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
Para impressão (gravar no arquivo), podemos utilizar a função fprintf,cujo funcionamento é muito parecido com a função printf.
1 int fprintf(FILE *stream, const char *format, ... );
Exemplo:
1 FILE *arquivo = fopen("texto.txt", "w");23 // escrevendo texto e um número inteiro no arquivo4 int n = 10;5 fprintf(arquivo, "O valor de n = %d\n", n);67 fclose(arquivo);
9 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
Exemplo completo de uso de fprintf:
1 #include <stdio.h>23 int main()4 {5 int inteiro = 10;6 char palavra[10] = "Palavra";78 // declaração e carregamento do arquivo9 FILE *arquivo = fopen("file.txt", "w");
1011 // gravando um inteiro e uma palavra no arquivo12 fprintf(arquivo, "%s - %d\n", palavra, inteiro);1314 // fechando (e salvando) o arquivo15 fclose(arquivo);16 }
10 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
Para leitura, podemos utilizar a função fscanf, cujo funcionamento émuito parecido com a função scanf.
1 int fscanf(FILE *stream, const char *format, ... );
A função retona o número de argumentos preenchidos ou EOF se o fimdo arquivo for atingido.
Exemplo de uso:
1 FILE *arquivo = fopen("file.txt", "r");23 // lendo um inteiro e um caractere separados por um espaço4 int inteiro;5 char caractere;6 fscanf(arquivo, "%d %c", &inteiro, &caractere);78 fclose(arquivo);
11 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Biblioteca <stdio.h>
Exemplo completo de uso de fscanf para ler um vetor:
1 #include <stdio.h>23 int main()4 {5 // declaração e carregamento do arquivo6 FILE *arquivo = fopen("file.txt", "r");78 // lendo o tamanho do vetor9 int n;
10 fscanf(arquivo, "%d", &n);1112 // criando e lendo o vetor13 int *vetor = malloc(n * sizeof(int));14 for (int i = 0; i < n; i++)15 fscanf(arquivo, "%d", &vetor[i]);1617 ...1819 // liberando a memória do vetor20 free(vetor);2122 // fechando (e salvando) o arquivo23 fclose(arquivo);24 }
12 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Outra funções
A biblioteca <stdio.h> fornece outras funções úteis para ler dados deum arquivo texto:
// lê uma linha, incluindo o '\n' de um arquivo (lembram dela?)char *fgets (char *str, int num, FILE *stream);
// lê um caractere e retorna (sim, retorna como um inteiro)int fgetc(FILE *stream);
// retorna 0 se a posição atual não for o fim do arquivo// e um valor diferente de 0 caso contrárioint feof(FILE *stream);
13 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Outra funções
A biblioteca <stdio.h> também fornece outras funções úteis para gravardados em um arquivo texto:
// escreve uma string no arquivo// a função retorna EOF em caso de erroint fputs(const char *str, FILE *stream);
// escreve um caractere no arquivo (sim, como um inteiro);// a função retorna EOF em caso de erroint fputc(int character, FILE *stream);
// retorna 0 se a posição atual não for o fim do arquivo// e um valor diferente de 0 caso contrárioint feof(FILE *stream);
// atualiza o arquivo (grava todo o conteúdo que ainda não foi// gravado); retorna 0 em caso de sucesso e EOF caso contrárioint fflush(FILE *stream);
14 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Aula de hoje
1 Arquivos
2 Biblioteca <stdio.h>
3 Exemplos
4 Exercícios
5 Próximas aulas
14 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 1
Crie um programa que conta o número de espaços em branco em umarquivo passado como argumento.
1 int main(int argc, char **argv)2 {3 int nEspacos = 0;4 char c;5 FILE *arquivo;67 arquivo = fopen(argv[1], "r"); // argv[1] é o primeiro argumento8 while (!feof(arquivo)) {9 c = fgetc(arquivo);
10 if (c == ' ') nEspacos++;11 }12 fclose(arquivo);1314 printf("O arquivo possui %d espaços.\n", nEspacos);15 return 0;16 }
15 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 2
Crie um programa que copia um arquivo texto em outro arquivo textoremovendo espaços (nomes dos arquivos são passados por argumento).
1 int main(int argc, char **argv)2 {3 char c;4 FILE *entrada, *saida;56 entrada = fopen(argv[1], "r"); // primeiro argumento7 saida = fopen(argv[2], "w"); // segundo argumento8 while (!feof(entrada)) {9 c = fgetc(entrada);
10 if (c != ' ' && c != EOF)11 fputc(c, saida);12 }13 fclose(entrada);14 fclose(saida);1516 return 0;17 }
16 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 2 (alternativa)
Crie um programa que copia um arquivo texto em outro arquivo textoremovendo espaços (nomes dos arquivos são passados por argumento).
1 int main(int argc, char **argv)2 {3 char c;4 FILE *entrada, *saida;56 entrada = fopen(argv[1], "r"); // primeiro argumento7 saida = fopen(argv[2], "w"); // segundo argumento8 while (fscanf(entrada, "%c", &c) != EOF) {9 if (c != ' ')
10 fprintf(saida, "%c", c);11 }12 fclose(entrada);13 fclose(saida);1415 return 0;16 }
17 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 3
Crie uma função que lê uma matriz n×m de inteiros de um arquivo textoe a imprime na saída. Assuma que n ≤ 100 e m ≤ 100.O arquivo tem a seguinte informação:
Os dois primeiro números indicam as dimensões da matriz (n e m).
Em seguida, a matriz é incluída no arquivo.
Exemplo:
1 5 42 10 9 4 33 2 8 3 04 2 3 1 95 28 3 6 46 9 1 4 5
18 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 3
1 /* Esta função lê os dados de uma matriz; note que as dimensões da2 * matriz são armazenadas nas variáveis n e m passadas por referência3 */4 void leMatriz(int matriz[100][100], char arquivo[], int &n, int &m)5 {6 FILE *entrada = fopen(arquivo, "r");78 fscanf(entrada, "%d", n);9 fscanf(entrada, "%d", m);
1011 for (int i = 0; i < *n; i++) {12 for (int j = 0; j < *m; j++)13 fscanf(entrada, "%d", &matriz[i][j]);14 }1516 fclose(entrada);17 }
19 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 4
Crie uma função que escreve uma matriz de inteiros em um arquivo.
Os dois primeiro números no arquivo indicam as dimensões da matriz.
Em seguida, a matriz é incluída no arquivo.
Exemplo:
1 5 42 10 9 4 33 2 8 3 04 2 3 1 95 28 3 6 46 9 1 4 5
A função deve ter a seguinte assinatura:
1 void escreveMatriz(int matriz[][100], char arquivo[], int n, int m);
20 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 4
1 /* Esta função escreve uma matriz de inteiros em um arquivo.2 */3 void escreveMatriz(int matriz[][100], char arquivo[], int n, int m)4 {5 FILE *saida = fopen(arquivo, "w");6 fprintf(saida, "%d %d\n", n, m);78 for (int i = 0; i < n; i++) {9 for (int j = 0; j < m; j++) {
10 if (j > 0)11 fprintf(arquivo, " ");12 fprintf(arquivo, "%d ", matriz[i][j]);13 }14 fprintf(arquivo, "\n");15 }1617 fclose(saida);18 }
21 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 5
Crie uma estrutura Pessoa contendo primeiro nome, CPF e salário de umfuncionário. Em seguida, crie um programa que lê os dados de nfuncionários e escreve os dados lidos em um arquivo texto como oapresentado a seguir:
1 Nome CPF Salario2 -----------------------------------------------3 Renata 123.456.789-10 2000.004 Rodrigo 123.456.789-10 1000.005 Tulio 123.456.789-10 1000.00
Crie duas funções:
1 // le os dados de n funcionarios e retorna um vetor2 Pessoa *lePessoas(int n);34 // salva no arquivo "saida" os dados de n funcionarios5 void gravaPessoas(char saida[], Pessoa *pessoas, int n);
22 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exemplo 5
1 #include <stdio.h>2 #include <stdlib.h>34 typedef struct {5 char nome[15]; // primero nome (de até 15 caracteres)6 char cpf[15]; // armazenado como uma string7 float salario;8 } Pessoa;9
10 Pessoa *lePessoas(int);11 void gravaPessoas(char[], Pessoa*, int);1213 int main() {14 int n;15 printf("Digite o nro de funcionarios: ");16 scanf("%d", &n);1718 Pessoa *pessoas = lePessoas(n);19 gravaPessoas("funcionarios.txt", pessoas, n);20 free(pessoas);21 return 0;22 }
23 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
1 Pessoa *lePessoas(int n) {2 Pessoa *pessoas = malloc(n * sizeof(Pessoa));3 for (int i = 0; i < n; i++) {4 printf("Digite nome, CPF e salário do funcionário %d:\n", i+1);5 scanf("%s", pessoas[i].nome);6 scanf("%s", pessoas[i].cpf);7 scanf("%f", &pessoas[i].salario);8 }9 return pessoas;
10 }1112 void gravaPessoas(char saida[], Pessoa *pessoas, int n) {13 FILE *file = fopen(saida, "w");1415 // imprimindo cabecalho16 fprintf(file, "%-15s %-15s %10s\n", "Nome", "CPF", "Salario");17 fprintf(file, "-----------------------------------------------\n");1819 // imprimindo dados dos funcionários20 for (int i = 0; i < n; i++)21 fprintf(file, "%-15s %-15s %10.2lf\n",22 pessoas[i].nome, pessoas[i].cpf, pessoas[i].salario);2324 fclose(file);25 }
24 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Aula de hoje
1 Arquivos
2 Biblioteca <stdio.h>
3 Exemplos
4 Exercícios
5 Próximas aulas
24 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Exercícios
Exercício 1Crie uma estrutura Aluno contendo primeiro nome, último nome efrequência (percentual). Em seguida, crie um programa que lê alunos deum arquivo texto e imprime os reprovados por frequência. Segue exemplodeste arquivo texto (o primeiro inteiro é o número de alunos):
1 32 Tulio Toffolo 100.03 Puca Penna 100.04 Aluno Reprovado 74.0
Exercício 2Elabore um programa que lê um arquivo de texto de, no máximo, 100linhas (e 100 colunas) e cria um arquivo com as linhas em ordem inversa.
Dica: utilize um vetor de strings (char[100][100]) para armazenar as linhas, euse a função fgets para ler uma linha completa do arquivo.
25 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Aula de hoje
1 Arquivos
2 Biblioteca <stdio.h>
3 Exemplos
4 Exercícios
5 Próximas aulas
25 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
Próximas aulas
Alocação dinâmica (Parte 2)
Alocação dinâmica (Parte 3)
Arquivos binários
Revisão
Prova 03
Trabalho Prático
26 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos de texto
/ 12
Perguntas?
Recommended