Curso de C Comunicação e Arquivos 24/05/2010 18:40 @ Arnaldo V Moura, Daniel F. Ferber 1
Tipos Avançados de Dados Roteiro: Fluxos de Dados Arquivos Abrir/Fechar Ler/Escrever Outras operações Entrada/Saída Padrão 24/05/2010 18:40 2
Fluxo de Dados: definição É a comunicação entre o programa e outras entidades: Teclado Terminal/prompt DOS Arquivos Conexões de de rede, Bluetooth Impressoras Portas seriais, USB, infra-vermelho Outros programas 24/05/2010 18:40 3
Fluxo de Dados: vantagens Modelo de comunicação genérico e unificado: Qualquer dispositivo parece funcionar da mesma maneira. Programas mais simples. Independência de plataforma e sistema operacional. 24/05/2010 18:40 4
Fluxo de Dados: modelo Produtor: escreve no no fluxo 24/05/2010 18:40 5
Fluxo de Dados: modelo Produtor: escreve no no fluxo Consumidor: lê lê do do fluxo 24/05/2010 18:40 6
Fluxo de Dados: modelo Produtor: escreve no no fluxo Consumidor: lê lê do do fluxo Fluxo: fila de de entrega de de dados O fluxo preserva a ordem Produtor e consumidor operam em ritmos diferentes 24/05/2010 18:40 7
Fluxo de Dados: modelo Produtor: escreve no no fluxo Consumidor: lê lê do do fluxo Fluxo: fila de de entrega de de dados O fluxo preserva a ordem Produtor e consumidor operam em ritmos diferentes Escreve Lê Produtor Fluxo Consumidor 24/05/2010 18:40 8
Fluxo de Dados: exemplo No fluxo, o programa pode ser consumidor! Teclado (produtor) (produtor) Arquivo (produtor) (produtor) Programa (consumidor) (consumidor) 24/05/2010 18:40 9
Fluxo de Dados: exemplo No fluxo, o programa pode ser consumidor! Teclado (produtor) (produtor) Teclas pressionadas Programa (consumidor) (consumidor) Arquivo (produtor) (produtor) 24/05/2010 18:40 10
Fluxo de Dados: exemplo No fluxo, o programa pode ser consumidor! Teclado (produtor) (produtor) Teclas pressionadas Arquivo (produtor) (produtor) Dados Programa (consumidor) (consumidor) 24/05/2010 18:40 11
Fluxo de Dados: exemplo No fluxo, o programa pode ser produtor! Programa (produtor) (produtor) Arquivo (consumidor) (consumidor) Tela Tela DOS (consumidor) (consumidor) 24/05/2010 18:40 12
Fluxo de Dados: exemplo No fluxo, o programa pode ser produtor! Programa (produtor) (produtor) Dados Arquivo (consumidor) (consumidor) Tela Tela DOS (consumidor) (consumidor) 24/05/2010 18:40 13
Fluxo de Dados: exemplo No fluxo, o programa pode ser produtor! Programa (produtor) (produtor) Dados Arquivo (consumidor) (consumidor) Resultados Tela Tela DOS (consumidor) (consumidor) 24/05/2010 18:40 14
Fluxo de Dados: tipos Curso C - IC/UNICAMP Somente leitura Teclado (produtor) (produtor) Programa (consumidor) (consumidor) 24/05/2010 18:40 15
Fluxo de Dados: tipos Curso C - IC/UNICAMP Somente leitura Teclado (produtor) (produtor) Teclas pressionadas Programa (consumidor) (consumidor) 24/05/2010 18:40 16
Fluxo de Dados: tipos Curso C - IC/UNICAMP Somente leitura Teclado (produtor) (produtor) Somente escrita Impressora (consumidor) (consumidor) Teclas pressionadas Programa (consumidor) (consumidor) Programa (produtor) (produtor) 24/05/2010 18:40 17
Fluxo de Dados: tipos Curso C - IC/UNICAMP Somente leitura Teclado (produtor) (produtor) Somente escrita Impressora (consumidor) (consumidor) Teclas pressionadas Dados Programa (consumidor) (consumidor) Programa (produtor) (produtor) 24/05/2010 18:40 18
Fluxo de Dados: tipos Curso C - IC/UNICAMP Somente leitura Teclado (produtor) (produtor) Somente escrita Impressora (consumidor) (consumidor) Leitura e escrita Arquivo (produtor e consumidor) Teclas pressionadas Dados Programa (consumidor) (consumidor) Programa (produtor) (produtor) Programa (produtor e consumidor) 24/05/2010 18:40 19
Fluxo de Dados: tipos Curso C - IC/UNICAMP Somente leitura Teclado (produtor) (produtor) Somente escrita Impressora (consumidor) (consumidor) Leitura e escrita Arquivo (produtor e consumidor) Teclas pressionadas Dados Conteúdo Programa (consumidor) (consumidor) Programa (produtor) (produtor) Programa (produtor e consumidor) 24/05/2010 18:40 20
Fluxo de Dados: fluxos de leitura Posição de leitura: Seqüencial ou aleatório 24/05/2010 18:40 21
Fluxo de Dados: fluxos de leitura Posição de leitura: Seqüencial ou aleatório Comprimento: Limitado ou ilimitado Marcas BOF & EOF 24/05/2010 18:40 22
Fluxo de Dados: fluxos de leitura Posição de leitura: Seqüencial ou aleatório Comprimento: Limitado ou ilimitado Marcas BOF & EOF Recebimento de dados: Bloqueante ou não bloqueante 24/05/2010 18:40 23
Fluxo de Dados: fluxos de escrita Posição de escrita: Seqüencial ou aleatório 24/05/2010 18:40 24
Fluxo de Dados: fluxos de escrita Posição de escrita: Seqüencial ou aleatório Comprimento: Praticamente ilimitado 24/05/2010 18:40 25
Fluxo de Dados: fluxos de escrita Posição de escrita: Seqüencial ou aleatório Comprimento: Praticamente ilimitado Envio de dados: Bloqueante ou não bloqueante 24/05/2010 18:40 26
Fluxo de Dados: leitura e escrita Posição de leitura ou escrita: Sempre aleatório 24/05/2010 18:40 27
Fluxo de Dados: leitura e escrita Posição de leitura ou escrita: Sempre aleatório Comprimento: Praticamente ilimitado 24/05/2010 18:40 28
Fluxo de Dados: leitura e escrita Posição de leitura ou escrita: Sempre aleatório Comprimento: Praticamente ilimitado Envio de dados: Bloqueante ou não bloqueante 24/05/2010 18:40 29
Fluxo de Dados: peculiaridades Fluxo binário 24/05/2010 18:40 30
Fluxo de Dados: peculiaridades Fluxo binário Fluxo texto Reconhecimento de \n Traduções automáticas de símbolos Tratamento automático do símbolo EOF 24/05/2010 18:40 31
Fluxo de Dados: operações 1. Abrir (estabelecer) o fluxo Define operações permitidas Especifica tipo de fluxo (binário/texto) Tipo de acesso (seqüencial ou aleatório) 24/05/2010 18:40 32
Fluxo de Dados: operações 1. Abrir (estabelecer) o fluxo Define operações permitidas Especifica tipo de fluxo (binário/texto) Tipo de acesso (seqüencial ou aleatório) 2. Ler e/ou escrever dados 24/05/2010 18:40 33
Fluxo de Dados: operações 1. Abrir (estabelecer) o fluxo Define operações permitidas Especifica tipo de fluxo (binário/texto) Tipo de acesso (seqüencial ou aleatório) 2. Ler e/ou escrever dados 3. Fechar (terminar) o fluxo Libera recursos Permite uso do fluxo por outro programa 24/05/2010 18:40 34
Comunicação e Arquivos Acesso a arquivos 24/05/2010 18:40 35
Arquivos: tipos de dados Declaração: FILE * arquivo; Define um fluxo para leitura e escrita em arquivo. Cada variável declarada é um fluxo independente Não é relevante como funciona o tipo FILE * 24/05/2010 18:40 36
Arquivos: abrir e fechar Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); 24/05/2010 18:40 37
Arquivos: abrir e fechar Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); Unidade de disco e diretório Caminho Relativo Nome do arquivo 24/05/2010 18:40 38
Arquivos: abrir e fechar Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); Unidade de disco e diretório Caminho Relativo Nome do arquivo r w a r+ w+ a+ b : binário t : texto 24/05/2010 18:40 39
Arquivos: abrir e fechar Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); Unidade de disco e diretório Caminho Relativo Nome do arquivo r w a r+ w+ a+ fclose(arquivo); b : binário t : texto 24/05/2010 18:40 40
Arquivos: abrir e fechar Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen( alunos.txt, r );... // Lê o nome de todos os alunos... fclose(arquivo); 24/05/2010 18:40 41
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fscanf(arquivo, fomato, &variavel); 24/05/2010 18:40 42
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fscanf(arquivo, fomato, &variavel); Semelhante a scanf 24/05/2010 18:40 43
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fscanf(arquivo, fomato, &variavel); Semelhante a scanf %d, %f, %c, %s, etc 24/05/2010 18:40 44
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fscanf(arquivo, fomato, &variavel); Semelhante a scanf %d, %f, %c, %s, etc Lista de variáveis 24/05/2010 18:40 45
Arquivos: leitura Curso C - IC/UNICAMP Leitura: Arquivo: José 9.5 8.5 Ana 7.0 8.0 Paulo 3.5 5.5 24/05/2010 18:40 46
Arquivos: leitura Curso C - IC/UNICAMP Leitura: FILE *arquivo; char nome[30]; float nota1, nota2; Arquivo: José 9.5 8.5 Ana 7.0 8.0 Paulo 3.5 5.5 arquivo = fopen( alunos.txt, r );... // // Lê Lê o nome e nota do do primeiro aluno fscanf(arquivo, %s %f %f %f, nome, ¬a1, ¬a2);... fclose(arquivo); 24/05/2010 18:40 47
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; char c, linha[102]; arquivo = fopen(nome, modo); Ler um caractere: Ler uma linha: 24/05/2010 18:40 48
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; char c, linha[102]; arquivo = fopen(nome, modo); Ler um caractere: c = fgetc(arquivo); Ler uma linha: 24/05/2010 18:40 49
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; char c, linha[102]; arquivo = fopen(nome, modo); Ler um caractere: Ler uma linha: c = fgetc(arquivo); fgets(linha, 100, arquivo); 24/05/2010 18:40 50
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; char c, linha[102]; arquivo = fopen(nome, modo); Ler um caractere: Ler uma linha: c = fgetc(arquivo); fgets(linha, 100, arquivo); variável para armazenar conteúdo 24/05/2010 18:40 51
Arquivos: leitura Curso C - IC/UNICAMP FILE *arquivo; char c, linha[102]; arquivo = fopen(nome, modo); Ler um caractere: Ler uma linha: c = fgetc(arquivo); fgets(linha, 100, arquivo); variável para armazenar conteúdo Tamanho máximo 24/05/2010 18:40 52
Arquivos: leitura Curso C - IC/UNICAMP Arquivo: Prezado cliente, Gostaríamos de... 24/05/2010 18:40 53
Arquivos: leitura Curso C - IC/UNICAMP Arquivo: Prezado cliente, FILE *arquivo; Gostaríamos de... char linha1[102], linha2[102]; arquivo = fopen( mensagem.txt, r );... fgets(linha1, 100, arquivo); fgets(linha2, 100, arquivo);... fclose(arquivo); 24/05/2010 18:40 54
Arquivos: leitura Curso C - IC/UNICAMP Arquivo: Prezado cliente, FILE *arquivo; Gostaríamos de... char linha1[102], linha2[102]; arquivo = fopen( mensagem.txt, r );... fgets(linha1, 100, arquivo); fgets(linha2, 100, arquivo);... fclose(arquivo); linha1 Prezado cliente, linha2 Gostaríamos de... 24/05/2010 18:40 55
Arquivos: fim de arquivo FILE *arquivo; arquivo = fopen( mensagem.txt, r );... while (! feof(arquivo)) {... Operação de leitura... }... fclose(arquivo); 24/05/2010 18:40 56
Arquivos: fim de arquivo FILE *arquivo; char nome[30]; float nota1, nota2; arquivo = fopen( notas.txt, r );... while (! feof(arquivo)) { q = fscanf(arquivo, %s %f %f,nome,¬a1,¬a2); if (q == 0) break;... }... fclose(arquivo); 24/05/2010 18:40 57
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fprintf(arquivo, texto, &variavel); 24/05/2010 18:40 58
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fprintf(arquivo, texto, &variavel); Semelhante a printf 24/05/2010 18:40 59
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fprintf(arquivo, texto, &variavel); Semelhante a printf %d, %f, %c, %s, etc 24/05/2010 18:40 60
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); fprintf(arquivo, texto, &variavel); Semelhante a printf Lista de variáveis %d, %f, %c, %s, etc 24/05/2010 18:40 61
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; char nome[30]; float nota1, nota2; arquivo = fopen( alunos.txt, w );... // // Escreve nome e nota do do primeiro aluno fprintf(arquivo, %s %f %f %f,nome,nota1, nota2);... fclose(arquivo); 24/05/2010 18:40 62
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); char c, texto[100]; Escrever um caractere: Escrever um texto: Garantir escrita no disco: 24/05/2010 18:40 63
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); char c, texto[100]; Escrever um caractere: fputc(c, arquivo); Escrever um texto: Garantir escrita no disco: 24/05/2010 18:40 64
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); char c, texto[100]; Escrever um caractere: fputc(c, arquivo); Escrever um texto: fputs(linha, arquivo); Garantir escrita no disco: 24/05/2010 18:40 65
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen(nome, modo); char c, texto[100]; Escrever um caractere: fputc(c, arquivo); Escrever um texto: fputs(linha, arquivo); Garantir escrita no disco: fflush(arquivo); 24/05/2010 18:40 66
Arquivos: escrita Curso C - IC/UNICAMP FILE *arquivo; arquivo = fopen( mensagem.txt, w );... fprintf(arquivo, Resultado da da operacao:\n ); // ou: fputs( Resultado da da operacao:\n, arquivo);... fclose(arquivo); 24/05/2010 18:40 Arquivos 67
Arquivos: deslocamentos FILE *arquivo; arquivo = fopen(nome, modo); obrigatório: w+ ou r+ Voltar ao inicio do arquivo: Consultar a posição atual: Avançar/Retroceder: 24/05/2010 18:40 68
Arquivos: deslocamentos FILE *arquivo; arquivo = fopen(nome, modo); obrigatório: w+ ou r+ Voltar ao inicio do arquivo: rewind(arquivo); Consultar a posição atual: Avançar/Retroceder: 24/05/2010 18:40 69
Arquivos: deslocamentos FILE *arquivo; arquivo = fopen(nome, modo); obrigatório: w+ ou r+ Voltar ao inicio do arquivo: Consultar a posição atual: Avançar/Retroceder: rewind(arquivo); p = ftell(arquivo); 24/05/2010 18:40 70
Arquivos: deslocamentos FILE *arquivo; arquivo = fopen(nome, modo); obrigatório: w+ ou r+ Voltar ao inicio do arquivo: Consultar a posição atual: rewind(arquivo); p = ftell(arquivo); Avançar/Retroceder: fseek(arquivo, deslocamento, referência); 24/05/2010 18:40 71
Arquivos: deslocamentos FILE *arquivo; arquivo = fopen(nome, modo); obrigatório: w+ ou r+ Voltar ao inicio do arquivo: Consultar a posição atual: rewind(arquivo); p = ftell(arquivo); Avançar/Retroceder: fseek(arquivo, deslocamento, referência); positivo: avança negativo: retrocede 24/05/2010 18:40 72
Arquivos: deslocamentos FILE *arquivo; arquivo = fopen(nome, modo); obrigatório: w+ ou r+ Voltar ao inicio do arquivo: Consultar a posição atual: rewind(arquivo); p = ftell(arquivo); Avançar/Retroceder: fseek(arquivo, deslocamento, referência); positivo: avança negativo: retrocede SEEK_CUR, SEEK_END, SEEK_SET 24/05/2010 18:40 73
Comunicação e Arquivos Entrada/Saída Padrão 24/05/2010 18:40 74
Entrada/Saída Padrão Três arquivos abertos automaticamente: 24/05/2010 18:40 75
Entrada/Saída Padrão Três arquivos abertos automaticamente: stdin: entrada padrão (teclado) 24/05/2010 18:40 76
Entrada/Saída Padrão Três arquivos abertos automaticamente: stdin: entrada padrão (teclado) stdout: saída padrão (terminal/tela DOS) 24/05/2010 18:40 77
Entrada/Saída Padrão Três arquivos abertos automaticamente: stdin: entrada padrão (teclado) stdout: saída padrão (terminal/tela DOS) stderr: saída de erro (terminal/tela DOS) 24/05/2010 18:40 78
Entrada/Saída Padrão Três arquivos abertos automaticamente: stdin: entrada padrão (teclado) stdout: saída padrão (terminal/tela DOS) stderr: saída de erro (terminal/tela DOS) Equivalentes: printf( texto ); fprintf(stdout, texto ); 24/05/2010 18:40 79
Comunicação e Arquivos FormatArq 24/05/2010 18:40 80