O documento discute fluxos de dados no C, incluindo:
1) O modelo de fluxo de dados com produtores, consumidores e filas de dados;
2) Diferentes tipos de fluxos como somente leitura, somente escrita e leitura/escrita;
3) Operações básicas em fluxos como abrir, ler, escrever e fechar.
1. Curso de C
Comunicação e Arquivos
8/6/2009 10:26 @ Arnaldo V Moura, Daniel F. Ferber 1
2. Curso C - IC/UNICAMP
Tipos Avançados de Dados
Roteiro:
• Fluxos de Dados
• Arquivos
– Abrir/Fechar
– Ler/Escrever
– Outras operações
• Entrada/Saída Padrão
8/6/2009 10:26 2
4. Curso C - IC/UNICAMP
Fluxo de Dados: definição
É a comunicação entre o programa e outras entidades:
É a comunicação entre o programa e outras entidades:
– Teclado
– Teclado
– Terminal/prompt DOS
– Terminal/prompt DOS
– Arquivos
– Arquivos
– Conexões de rede, Bluetooth
– Conexões de rede, Bluetooth
– Impressoras
– Impressoras
– Portas seriais, USB, infra-vermelho
– Portas seriais, USB, infra-vermelho
– Outros programas
– Outros programas
8/6/2009 10:26 4
5. Curso C - IC/UNICAMP
Fluxo de Dados: vantagens
Modelo de comunicação genérico e unificado:
Modelo de comunicação genérico e unificado:
– Qualquer dispositivo parece funcionar da
– Qualquer dispositivo parece funcionar da
“mesma maneira”.
“mesma maneira”.
– Programas mais simples.
– Programas mais simples.
– Independência de plataforma e sistema
– Independência de plataforma e sistema
operacional.
operacional.
8/6/2009 10:26 5
6. Curso C - IC/UNICAMP
Fluxo de Dados: modelo
•• Produtor: escreve no fluxo
Produtor: escreve no fluxo
8/6/2009 10:26 6
7. Curso C - IC/UNICAMP
Fluxo de Dados: modelo
•• Produtor: escreve no fluxo
Produtor: escreve no fluxo
•• Consumidor: lê do fluxo
Consumidor: lê do fluxo
8/6/2009 10:26 7
8. Curso C - IC/UNICAMP
Fluxo de Dados: modelo
•• Produtor: escreve no fluxo
Produtor: escreve no fluxo
•• Consumidor: lê do fluxo
Consumidor: lê do fluxo
•• Fluxo: fila de entrega de dados
Fluxo: fila de entrega de dados
– O fluxo preserva a ordem
– O fluxo preserva a ordem
– Produtor e consumidor operam em ritmos diferentes
– Produtor e consumidor operam em ritmos diferentes
8/6/2009 10:26 8
9. Curso C - IC/UNICAMP
Fluxo de Dados: modelo
•• Produtor: escreve no fluxo
Produtor: escreve no fluxo
•• Consumidor: lê do fluxo
Consumidor: lê do fluxo
•• Fluxo: fila de entrega de dados
Fluxo: fila de entrega de dados
– O fluxo preserva a ordem
– O fluxo preserva a ordem
– Produtor e consumidor operam em ritmos diferentes
– Produtor e consumidor operam em ritmos diferentes
Escreve Lê
Produtor
Produtor Fluxo Consumidor
Consumidor
8/6/2009 10:26 9
10. Curso C - IC/UNICAMP
Fluxo de Dados: exemplo
•• No fluxo, o programa pode ser consumidor!
No fluxo, o programa pode ser consumidor!
Teclado
Teclado
(produtor)
(produtor)
Programa
Programa
(consumidor)
(consumidor)
Arquivo
Arquivo
(produtor)
(produtor)
8/6/2009 10:26 10
11. Curso C - IC/UNICAMP
Fluxo de Dados: exemplo
•• No fluxo, o programa pode ser consumidor!
No fluxo, o programa pode ser consumidor!
Teclado
Teclado
(produtor) Tecla
(produtor) s pre
ssion
adas
Programa
Programa
(consumidor)
(consumidor)
Arquivo
Arquivo
(produtor)
(produtor)
8/6/2009 10:26 11
12. Curso C - IC/UNICAMP
Fluxo de Dados: exemplo
•• No fluxo, o programa pode ser consumidor!
No fluxo, o programa pode ser consumidor!
Teclado
Teclado
(produtor) Tecla
(produtor) s pre
ssion
adas
Programa
Programa
(consumidor)
(consumidor)
s
Arquivo Dado
Arquivo
(produtor)
(produtor)
8/6/2009 10:26 12
13. Curso C - IC/UNICAMP
Fluxo de Dados: exemplo
•• No fluxo, o programa pode ser produtor!
No fluxo, o programa pode ser produtor!
Arquivo
Arquivo
(consumidor)
(consumidor)
Programa
Programa
(produtor)
(produtor)
Tela DOS
Tela DOS
(consumidor)
(consumidor)
8/6/2009 10:26 13
14. Curso C - IC/UNICAMP
Fluxo de Dados: exemplo
•• No fluxo, o programa pode ser produtor!
No fluxo, o programa pode ser produtor!
Arquivo
Arquivo
(consumidor)
(consumidor)
s
Dado
Programa
Programa
(produtor)
(produtor)
Tela DOS
Tela DOS
(consumidor)
(consumidor)
8/6/2009 10:26 14
15. Curso C - IC/UNICAMP
Fluxo de Dados: exemplo
•• No fluxo, o programa pode ser produtor!
No fluxo, o programa pode ser produtor!
Arquivo
Arquivo
(consumidor)
(consumidor)
s
Dado
Programa
Programa
(produtor)
(produtor)
Resu
ltado
s
Tela DOS
Tela DOS
(consumidor)
(consumidor)
8/6/2009 10:26 15
16. Curso C - IC/UNICAMP
Fluxo de Dados: tipos
•• Somente leitura
Somente leitura
Teclado
Teclado Programa
Programa
(produtor)
(produtor) (consumidor)
(consumidor)
8/6/2009 10:26 16
17. Curso C - IC/UNICAMP
Fluxo de Dados: tipos
•• Somente leitura
Somente leitura
Teclado
Teclado Teclas pressionadas Programa
Programa
(produtor)
(produtor) (consumidor)
(consumidor)
8/6/2009 10:26 17
18. Curso C - IC/UNICAMP
Fluxo de Dados: tipos
•• Somente leitura
Somente leitura
Teclado
Teclado Teclas pressionadas Programa
Programa
(produtor)
(produtor) (consumidor)
(consumidor)
•• Somente escrita
Somente escrita
Impressora
Impressora Programa
Programa
(consumidor)
(consumidor) (produtor)
(produtor)
8/6/2009 10:26 18
19. Curso C - IC/UNICAMP
Fluxo de Dados: tipos
•• Somente leitura
Somente leitura
Teclado
Teclado Teclas pressionadas Programa
Programa
(produtor)
(produtor) (consumidor)
(consumidor)
•• Somente escrita
Somente escrita
Impressora
Impressora Dados
Programa
Programa
(consumidor)
(consumidor) (produtor)
(produtor)
8/6/2009 10:26 19
20. Curso C - IC/UNICAMP
Fluxo de Dados: tipos
•• Somente leitura
Somente leitura
Teclado
Teclado Teclas pressionadas Programa
Programa
(produtor)
(produtor) (consumidor)
(consumidor)
•• Somente escrita
Somente escrita
Impressora
Impressora Dados
Programa
Programa
(consumidor)
(consumidor) (produtor)
(produtor)
•• Leitura e escrita
Leitura e escrita
Arquivo
Arquivo Programa
Programa
(produtor e
(produtor e (produtor e
(produtor e
consumidor)
consumidor) consumidor)
consumidor)
8/6/2009 10:26 20
21. Curso C - IC/UNICAMP
Fluxo de Dados: tipos
•• Somente leitura
Somente leitura
Teclado
Teclado Teclas pressionadas Programa
Programa
(produtor)
(produtor) (consumidor)
(consumidor)
•• Somente escrita
Somente escrita
Impressora
Impressora Dados
Programa
Programa
(consumidor)
(consumidor) (produtor)
(produtor)
•• Leitura e escrita
Leitura e escrita
Arquivo
Arquivo Programa
Programa
(produtor e
(produtor e Conteúdo (produtor e
(produtor e
consumidor)
consumidor) consumidor)
consumidor)
8/6/2009 10:26 21
22. Curso C - IC/UNICAMP
Fluxo de Dados: fluxos de leitura
•• Posição de leitura:
Posição de leitura:
– Seqüencial ou aleatório
– Seqüencial ou aleatório
8/6/2009 10:26 22
23. Curso C - IC/UNICAMP
Fluxo de Dados: fluxos de leitura
•• Posição de leitura:
Posição de leitura:
– Seqüencial ou aleatório
– Seqüencial ou aleatório
•• Comprimento:
Comprimento:
– Limitado ou ilimitado
– Limitado ou ilimitado
– Marcas BOF & EOF
– Marcas BOF & EOF
8/6/2009 10:26 23
24. Curso C - IC/UNICAMP
Fluxo de Dados: fluxos de leitura
•• Posição de leitura:
Posição de leitura:
– Seqüencial ou aleatório
– Seqüencial ou aleatório
•• Comprimento:
Comprimento:
– Limitado ou ilimitado
– Limitado ou ilimitado
– Marcas BOF & EOF
– Marcas BOF & EOF
•• Recebimento de dados:
Recebimento de dados:
– Bloqueante ou não bloqueante
– Bloqueante ou não bloqueante
8/6/2009 10:26 24
25. Curso C - IC/UNICAMP
Fluxo de Dados: fluxos de escrita
•• Posição de escrita:
Posição de escrita:
– Seqüencial ou aleatório
– Seqüencial ou aleatório
8/6/2009 10:26 25
26. Curso C - IC/UNICAMP
Fluxo de Dados: fluxos de escrita
•• Posição de escrita:
Posição de escrita:
– Seqüencial ou aleatório
– Seqüencial ou aleatório
•• Comprimento:
Comprimento:
– Praticamente ilimitado
– Praticamente ilimitado
8/6/2009 10:26 26
27. Curso C - IC/UNICAMP
Fluxo de Dados: fluxos de escrita
•• Posição de escrita:
Posição de escrita:
– Seqüencial ou aleatório
– Seqüencial ou aleatório
•• Comprimento:
Comprimento:
– Praticamente ilimitado
– Praticamente ilimitado
•• Envio de dados:
Envio de dados:
– Bloqueante ou não bloqueante
– Bloqueante ou não bloqueante
8/6/2009 10:26 27
28. Curso C - IC/UNICAMP
Fluxo de Dados: leitura e escrita
•• Posição de leitura ou escrita:
Posição de leitura ou escrita:
– Sempre aleatório
– Sempre aleatório
8/6/2009 10:26 28
29. Curso C - IC/UNICAMP
Fluxo de Dados: leitura e escrita
•• Posição de leitura ou escrita:
Posição de leitura ou escrita:
– Sempre aleatório
– Sempre aleatório
•• Comprimento:
Comprimento:
– Praticamente ilimitado
– Praticamente ilimitado
8/6/2009 10:26 29
30. Curso C - IC/UNICAMP
Fluxo de Dados: leitura e escrita
•• Posição de leitura ou escrita:
Posição de leitura ou escrita:
– Sempre aleatório
– Sempre aleatório
•• Comprimento:
Comprimento:
– Praticamente ilimitado
– Praticamente ilimitado
•• Envio de dados:
Envio de dados:
– Bloqueante ou não bloqueante
– Bloqueante ou não bloqueante
8/6/2009 10:26 30
31. Curso C - IC/UNICAMP
Fluxo de Dados: peculiaridades
•• Fluxo binário
Fluxo binário
8/6/2009 10:26 31
32. Curso C - IC/UNICAMP
Fluxo de Dados: peculiaridades
•• Fluxo binário
Fluxo binário
•• Fluxo texto
Fluxo texto
– Reconhecimento de ‘n’
– Reconhecimento de ‘n’
– Traduções automáticas de símbolos
– Traduções automáticas de símbolos
– Tratamento automático de símbolo EOF
– Tratamento automático de símbolo EOF
8/6/2009 10:26 32
33. Curso C - IC/UNICAMP
Fluxo de Dados: operações
1. Abrir (estabelecer) o fluxo
1. Abrir (estabelecer) o fluxo
•• Define operações permitidas
Define operações permitidas
•• Especifica tipo de fluxo (binário/texto)
Especifica tipo de fluxo (binário/texto)
•• Tipo de acesso (seqüencial ou aleatório)
Tipo de acesso (seqüencial ou aleatório)
8/6/2009 10:26 33
34. Curso C - IC/UNICAMP
Fluxo de Dados: operações
1. Abrir (estabelecer) o fluxo
1. Abrir (estabelecer) o fluxo
•• Define operações permitidas
Define operações permitidas
•• Especifica tipo de fluxo (binário/texto)
Especifica tipo de fluxo (binário/texto)
•• Tipo de acesso (seqüencial ou aleatório)
Tipo de acesso (seqüencial ou aleatório)
2. Ler e/ou escrever dados
2. Ler e/ou escrever dados
8/6/2009 10:26 34
35. Curso C - IC/UNICAMP
Fluxo de Dados: operações
1. Abrir (estabelecer) o fluxo
1. Abrir (estabelecer) o fluxo
•• Define operações permitidas
Define operações permitidas
•• Especifica tipo de fluxo (binário/texto)
Especifica tipo de fluxo (binário/texto)
•• Tipo de acesso (seqüencial ou aleatório)
Tipo de acesso (seqüencial ou aleatório)
2.
2. Ler e/ou escrever dados
Ler e/ou escrever dados
3.
3. Fechar (terminar) o fluxo
Fechar (terminar) o fluxo
•• Libera recursos
Libera recursos
•• Permite uso do fluxo por outro programa
Permite uso do fluxo por outro programa
8/6/2009 10:26 35
37. Curso C - IC/UNICAMP
Arquivos: tipos de dados
Declaração:
Declaração:
FILE * arquivo;
FILE * arquivo;
•• Define um fluxo para leitura e escrita em
Define um fluxo para leitura e escrita em
arquivo.
arquivo.
•• Cada variável declarada é fluxo independente
Cada variável declarada é fluxo independente
•• Não é relevante como funciona o tipo FILE *
Não é relevante como funciona o tipo FILE *
8/6/2009 10:26 37
38. Curso C - IC/UNICAMP
Arquivos: abrir e fechar
FILE *arquivo;
arquivo = fopen(nome, modo);
8/6/2009 10:26 38
39. Curso C - IC/UNICAMP
Arquivos: abrir e fechar
FILE *arquivo;
arquivo = fopen(nome, modo);
• Unidade de disco e diretório
• Caminho Relativo
• Nome do arquivo
8/6/2009 10:26 39
40. Curso C - IC/UNICAMP
Arquivos: abrir e fechar
FILE *arquivo;
arquivo = fopen(nome, modo);
• Unidade de disco e diretório “r” “r+”
• Caminho Relativo “w” “w+”
• Nome do arquivo “a” “a+”
“b”: binário
“t”: texto
8/6/2009 10:26 40
41. Curso C - IC/UNICAMP
Arquivos: abrir e fechar
FILE *arquivo;
arquivo = fopen(nome, modo);
• Unidade de disco e diretório “r” “r+”
• Caminho Relativo “w” “w+”
• Nome do arquivo “a” “a+”
fclose(arquivo); “b”: binário
“t”: texto
8/6/2009 10:26 41
42. Curso C - IC/UNICAMP
Arquivos: abrir e fechar
FILE *arquivo;
FILE *arquivo;
arquivo = fopen(“alunos.txt”, “r”);
arquivo = fopen(“alunos.txt”, “r”);
...
...
// Lê o nome de todos os alunos
// Lê o nome de todos os alunos
...
...
fclose(arquivo);
fclose(arquivo);
8/6/2009 10:26 42
46. Curso C - IC/UNICAMP
Arquivos: leitura
FILE *arquivo;
arquivo = fopen(nome, modo);
fscanf(arquivo, “fomato”, &variavel);
Lista de
Semelhante a
variáveis
scanf
%d, %f, %c, %s, etc
8/6/2009 10:26 46
47. Curso C - IC/UNICAMP
Arquivos: leitura
Leitura: Arquivo:
Arquivo:
José 9.5
José 9.5 8.5
8.5
Ana 7.0
Ana 7.0 8.0
8.0
Paulo 3.5
Paulo 3.5 5.5
5.5
8/6/2009 10:26 47
48. Curso C - IC/UNICAMP
Arquivos: leitura
Leitura: Arquivo:
Arquivo:
FILE *arquivo;
FILE *arquivo; José 9.5
José 9.5 8.5
8.5
char nome[30];
char nome[30]; Ana 7.0
Ana 7.0 8.0
8.0
float nota1, nota2;
float nota1, nota2; Paulo 3.5
Paulo 3.5 5.5
5.5
arquivo = fopen(“alunos.txt”, “r”);
arquivo = fopen(“alunos.txt”, “r”);
...
...
// Lê o nome e nota do primeiro aluno
// Lê o nome e nota do primeiro aluno
fscanf(arquivo, “%s %f %f”, nome, ¬a1,
fscanf(arquivo, “%s %f %f”, nome, ¬a1,
¬a2);
¬a2);
...
...
fclose(arquivo);
fclose(arquivo);
8/6/2009 10:26 48
49. Curso C - IC/UNICAMP
Arquivos: leitura
FILE *arquivo;
char c, linha[102];
arquivo = fopen(nome, modo);
Ler um caractere:
Ler uma linha:
8/6/2009 10:26 49
50. Curso C - IC/UNICAMP
Arquivos: leitura
FILE *arquivo;
char c, linha[102];
arquivo = fopen(nome, modo);
Ler um caractere: c = fgetc(arquivo);
Ler uma linha:
8/6/2009 10:26 50
51. Curso C - IC/UNICAMP
Arquivos: leitura
FILE *arquivo;
char c, linha[102];
arquivo = fopen(nome, modo);
Ler um caractere: c = fgetc(arquivo);
Ler uma linha: fgets(linha, 100, arquivo);
8/6/2009 10:26 51
52. Curso C - IC/UNICAMP
Arquivos: leitura
FILE *arquivo;
char c, linha[102];
arquivo = fopen(nome, modo);
Ler um caractere: c = fgetc(arquivo);
Ler uma linha: fgets(linha, 100, arquivo);
variável para armazenar conteúdo
8/6/2009 10:26 52
53. Curso C - IC/UNICAMP
Arquivos: leitura
FILE *arquivo;
char c, linha[102];
arquivo = fopen(nome, modo);
Ler um caractere: c = fgetc(arquivo);
Ler uma linha: fgets(linha, 100, arquivo);
Tamanho
variável para armazenar conteúdo máximo
8/6/2009 10:26 53
62. Curso C - IC/UNICAMP
Arquivos: escrita
FILE *arquivo;
arquivo = fopen(nome, modo);
fprintf(arquivo, “texto”, &variavel);
Lista de
Semelhante a
variáveis
printf
%d, %f, %c, %s, etc
8/6/2009 10:26 62
63. Curso C - IC/UNICAMP
Arquivos: escrita
FILE *arquivo;
FILE *arquivo;
char nome[30];
char nome[30];
float nota1, nota2;
float nota1, nota2;
arquivo = fopen(“alunos.txt”, “w”);
arquivo = fopen(“alunos.txt”, “w”);
...
...
// Escreve nome e nota do primeiro aluno
// Escreve nome e nota do primeiro aluno
fprintf(arquivo,“%s %f %f”,nome,nota1, nota2);
fprintf(arquivo,“%s %f %f”,nome,nota1, nota2);
...
...
fclose(arquivo);
fclose(arquivo);
8/6/2009 10:26 63
64. Curso C - IC/UNICAMP
Arquivos: escrita
FILE *arquivo;
arquivo = fopen(nome, modo);
char c, texto[100];
Escrever um caractere:
Escrever um texto:
Garantir escrita no disco:
8/6/2009 10:26 64
65. Curso C - IC/UNICAMP
Arquivos: escrita
FILE *arquivo;
arquivo = fopen(nome, modo);
char c, texto[100];
Escrever um caractere: fputc(c, arquivo);
Escrever um texto:
Garantir escrita no disco:
8/6/2009 10:26 65
66. Curso C - IC/UNICAMP
Arquivos: escrita
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:
8/6/2009 10:26 66
67. Curso C - IC/UNICAMP
Arquivos: escrita
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);
8/6/2009 10:26 67
68. Curso C - IC/UNICAMP
Arquivos: escrita
FILE *arquivo;
FILE *arquivo;
arquivo = fopen(“mensagem.txt”, “w”);
arquivo = fopen(“mensagem.txt”, “w”);
...
...
fprintf(arquivo, “Resultado da operacao:n”);
fprintf(arquivo, “Resultado da operacao:n”);
// ou:
// ou:
fputs(“Resultado da operacao:n”, arquivo);
fputs(“Resultado da operacao:n”, arquivo);
...
...
fclose(arquivo);
fclose(arquivo);
8/6/2009 10:26 Arquivos 68
69. Curso C - IC/UNICAMP
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:
8/6/2009 10:26 69
70. Curso C - IC/UNICAMP
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:
8/6/2009 10:26 70
71. Curso C - IC/UNICAMP
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: p = ftell(arquivo);
Avançar/Retroceder:
8/6/2009 10:26 71
72. Curso C - IC/UNICAMP
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: p = ftell(arquivo);
Avançar/Retroceder:
fseek(arquivo, deslocamento, referência);
8/6/2009 10:26 72
73. Curso C - IC/UNICAMP
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: p = ftell(arquivo);
Avançar/Retroceder:
fseek(arquivo, deslocamento, referência);
positivo: avança
negativo: retrocede
8/6/2009 10:26 73
74. Curso C - IC/UNICAMP
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: p = ftell(arquivo);
Avançar/Retroceder:
fseek(arquivo, deslocamento, referência);
positivo: avança
negativo: retrocede SEEK_CUR, SEEK_END,
8/6/2009 10:26 SEEK_SET 74