33
Aula 26: Arquivos de texto Introduªo a Programaªo Toelio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2019/1 Departamento de Computaªo UFOP

Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 2: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 3: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 4: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 5: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 6: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 7: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 8: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 9: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 10: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 11: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 12: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 13: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 14: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 15: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 16: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 17: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 18: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 19: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 20: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 21: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 22: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 23: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 24: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 25: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 26: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 27: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 28: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 29: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 30: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 31: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 32: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

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

Page 33: Aula 26: Arquivos de texto - Introdução a Programação...Acesso à informação pode ser concorrente. 3 / 26 Túlio Toffolo – Introdução a Programação – Aula 26: Arquivos

/ 12

Perguntas?