Mudanças entre as edições de "AULA 21 - Programação 1 - Graduação"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(100 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
=Objetivos=
+
=Requisito para formação das Equipes=
  
*Tratamento de arquivos no C;
+
*Três integrantes por equipe.
*O sistema de arquivos no Linux;
 
*O acesso com funções de alto nível.
 
  
=O Sistema de Arquivos no Linux=
+
=Equipes do Projeto Final - Participantes=
  
==O Arquivo==
+
[[Equipe1-2015-1]]
'''Um arquivo é um conjunto de dados que pode ser referenciado por um nome e pode ter outros atributos tais como: permissão para leitura e escrita, data da criação, data da última modificação etc.'''
+
*MARIA FERNANDA SILVA TUTUI
 +
*RICARDO AMORIM
 +
*VITOR MANOEL DA SILVEIRA
  
Note que um arquivo pode conter dados (um relatório, por exemplo), um programa C, um programa executável, música, fotos etc. Seja qual for a natureza dos dados o armazenamento será na forma de bits.
+
[[Equipe2-2015-1]]
 +
*ADONIS ANDREAS MARINOS
 +
*ANDERSON GASPAR DE MEDEIROS
 +
*DANIEL TREVISAN TATSCH
  
Normalmente, arquivos são armazenados em memórias secundárias, tais como CD, hard disk etc, mas eles podem se armazenados na memória principal também (RAM, FLASH).
+
[[Equipe3-2015-1]]
 +
*DANIEL CABRAL CORREA
 +
*PABLO FIDELIS DIAS
 +
*PAULO HENRIQUE HORST BIANCHIN
  
Quanto a forma como os dados são armazenados, podemos dizer que os arquivos são [http://en.wikipedia.org/wiki/Binary_file binários] ou [http://en.wikipedia.org/wiki/Text_file texto]. Qualquer um deles armazena bits mas os bytes de um arquivo texto representam códigos ASCII.
+
[[Equipe4-2015-1]]
 +
*ADILSON GOEDERT SIQUEIRA
 +
*GUSTAVO VIEIRA ZACCHI
 +
*RAPHAEL WASHINGTON BAPTISTA GIASSI
  
==Sistema de Arquivos==
+
[[Equipe5-2015-1]]
 +
*LEONARDO TASCA
 +
*LUISA MACHADO
 +
*NATALIA ADRIANA MIRANDA
  
Um sistema tal como o Linux possui milhares de arquivos. Para que arquivos possam ser acessados e armazenados de forma consistente, eles são organizados em um sistema de arquivos.
+
[[Equipe6-2015-1]]
 +
*AUGUSTO DA SILVEIRA WILLEMANN
 +
*GABRIEL FARIAS TURNES
 +
*JEFERSON RICARDO TICHZ ESPINDOLA
  
Tipicamente, um sistema de arquivos ocupa uma área de um disco (ou mídia de armazenamento).
+
[[Equipe7-2015-1]]
Nesta área ficam armazenados blocos de armazenamento dos dados dos arquivos e também as estruturas chamadas de '''inodes'''.
+
*JOAO VITOR DA ANUNCIACAO
 +
*RAISSA LINHARES GOMES
 +
*VICTOR CESCONETTO DE PIERI
  
Um [http://upload.wikimedia.org/wikipedia/commons/a/a2/Ext2-inode.gif inode] é um estrutura que possui as propriedades do arquivo e ponteiros para os blocos que contém os dados do arquivo. Tipicamente um sistema de arquivos possui uma lista de inodes que permite "indexar" cada um dos arquivos do sistema de arquivos.
 
  
Existem vários formatos de sistema de arquivos, dependendo do sistema operacional. No linux os formatos mais conhecidos são: ext2, ext3, ext4 etc.
+
<!--
 +
=Placa de aquisição de dados=
  
Um sistema de arquivos normalmente possui uma estrutura de dados inicial chamada de superbloco. O superbloco traz informações sobre o tamanho de blocos do sistema, o início da lista de inodes (/), etc.
+
*Saídas digitais
  
{| border="1" cellpadding="5" cellspacing="0"  
+
Existem 3 saídas digitais na placa, e essas são chamadas de OUT1, OUT2 e OUT3.
! style="background: #0080c0; color:white" | superbloco
+
 
! style="background: #0080c0; color:white" | lista de inodes
+
[[Arquivo:saida_digital.jpg|600px]]
! style="background: #0080c0; color:white" | blocos dos arquivos
+
 
|}
+
Essas saídas são energizadas, e quando estão ligadas enviam 5V a saída escolhida.
 +
 
 +
 
 +
 
 +
*Entradas digitais
 +
 
 +
Existem, também, 3 entradas digitais, que são nomeadas INP1, INP2 e INP3.
 +
 
 +
[[Arquivo:entrada_digital.jpg|600px]]
 +
 
 +
Essas entradas são do tipo seco, o que significa que elas ficam ativas quando aterradas(GND).
 +
 
 +
 
 +
 
 +
*Saídas analógicas
 +
 
 +
Existem 2 saídas analógicas, e essas nomeadas DA1 e DA2.
 +
 
 +
[[Arquivo:saida_analogica.jpg|500px]]
 +
 
 +
Essas saídas podem ser ajustadas para mandar tensões entre 0V e 5V.
 +
 
 +
 
 +
 
 +
*Entradas analógicas
 +
 
 +
As 8 entradas analógicas existentes na placa são nomeadas como AD1, AD2, AD3...AD8
 +
 
 +
[[Arquivo:entrada_analogica.jpg|500px]]
 +
 
 +
Estas entradas suportam tensões de até 10V
 +
 
 +
 
 +
==Instalação==
 +
 
 +
Fazer o dowload do arquivo bibprg neste link: [http://db.tt/17JRNYpK Download]
 +
 
 +
Instruções para instalação:
 +
 
 +
Na pasta make:
 +
 
 +
*Dentro do arquivo shell.sh, no campo "SENHA". Botar senha de root do PC em uso;
 +
 
 +
*Dentro do arquivo Perm-Cerne.rules, na segunda linha, no campo OWNER="Aluno". Mudar "Aluno" para o nome do usuário do computador.
 +
 
 +
Feito isso, basta que, a partir do terminal, seja feito o comando make dentro da pasta make.
 +
 
 +
==Criando programas em C utilizando a biblioteca prg==
 +
 
 +
As seguintes funções estão disponíveis nesta biblioteca:
 +
 
 +
*função conectar:
 +
esta função conecta a plaquinha ao host PC
 +
 
 +
Parâmetros: não possui
 +
 
 +
como utilizar:
 +
conectar ();
 +
 
 +
 
 +
*Função "info"  
 +
esta função retorna informações da placa. Pode retornar o nome do fabricante e o string do produto.
 +
 
 +
Parâmetros: não possui
 +
 
 +
como utilizar:
 +
info ();  
 +
 
 +
 
 +
*Função "enviar_digital"
 +
Envia um sinal para uma das 3 saídas digitais da placa de aquisição
 +
 
 +
como utilizar:
 +
 
 +
Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída digital (1, 2 ou 3) e o segundo representa o estado da saída, podendo ser 1(nível alto) ou 0(nível baixo).
 +
 
 +
enviar_digital (saída, estado);  
 +
 
 +
/*IMPORTANTE: as varíaveis saída e estado, sao do tipo CHAR*/
 +
ou
 +
 
 +
enviar_digital (‘1’, ‘1’)
 +
 
 +
/*saída 1 é colocada em nivel alto(5V)*/
 +
 
 +
 
 +
*Função "enviar_analogica"
 +
função utilizada para enviar um sinal para uma das 2 saídas analógicas da placa de aquisição
 +
 
 +
como utilizar:
 +
Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída analógica (1 ou 2) e o segundo é uma string que representa o estado da saída, podendo esta variar de “000” a “255”. Onde “000” é 0V e 255 é 5V.
 +
Outras tensões podem ser encontradas através de calculos simples, como 2,5V  “127”
 +
 
 +
enviar_analogica (saida, estado);
 +
 
 +
/*Onde a variavel saida e estado sao do tipo CHAR*/
 +
 
 +
ou
 +
 
 +
enviar_analogica (‘1’, “127”);
 +
 
 +
/*onde a saída analógica 1 está sendo energizada com aproximadamente 2.5V*/
 +
 
 +
 +
*Função "receber_digital"
 +
 
 +
Função utilizada para receber informações das entradas digitais;
 +
 
 +
A entrada digital desta placa é do tipo seco. Ela retornará 0 caso a entrada NÃO estiver aterrada, e 1 se estiver.
 +
 
 +
 
 +
como utilizar:
 +
 
 +
Parâmetros: receber(nº da saída);  
 +
Retorno: o retorno desta função é um inteiro (int)
 +
 
 +
receber_digital (char saida) ;
  
 +
ou
  
==Diretórios==
+
receber_digital (‘1’) ;
  
São arquivos especiais que contém basicamente uma lista contendo nome e inode correspondente dos arquivos que o diretório contém.
+
/*onde a função retornará 0 ou 1 da entrada 1 */
 +
/*Existem 3 entradas digitais, portanto a variavel saída pode ser 1, 2 ou 3*/
  
Em um sistema de arquivos, o diretório / é o diretório raiz do sistema, a partir do qual pode-se encontrar todos os demais arquivos.
 
  
==Referência a um arquivo==
+
*Função "receber_analogica"
 +
Função utilizada para receber informações das entradas analógicas;
  
A localização de um arquivo pode ser realizada pela referência absoluta, ou seja, desde o diretório / do sistema:
+
As entradas analógicas retornam valores de 0,00V a 9,99V;
  
cat /etc/passwd
+
como utilizar:
  
O comando cat tem por objetivo mostrar no terminal o conteúdo do arquivo ''passwd''. Para que este arquivo seja encontrado na árvore de diretórios, deve-se fornecer a referência absoluta, desde o diretório /
+
Parâmetros: receber(nº da saída);
 +
Retorno: o retorno desta função é um número real (float)
  
Uma alternativa de acesso, é o uso da referência relativa ao diretório de trabalho. O conceito de diretório de trabalho é criado pelo interpretador de comandos (''shell''). Desta forma pode-se por exemplo fazer o comando:
+
receber_analogica (char saida) ;
  
cat passwd
+
ou
  
O sistema procurará o arquivo passwd dentro do diretório de trabalho, que é referenciado armazenado pelo ''shell''. Neste caso, o diretório de trabalho deveria ser ''/etc''
+
receber_analogica (‘1’) ;
  
cd /etc
+
/*onde a função retornará retornará um valor entre 0,00 e 9,99 */
cat passwd
+
/*Existem 8 entradas analogicas, portanto a variavel saída pode ser 1, 2, 3, 4, 5, 6, 7 ou 8*/
  
=====No Linux/Unix tudo é arquivo=====
 
  
No Linux, qualquer referência/acesso ao hardware/dispositivos é realizada na forma de acesso a arquivo. Ver arquivos no diretório de dispositivos:
+
*Função "print_display"
 +
/*Função utilizada para imprimir um mensagem no display lcd*/
  
  ls -l /dev
+
como utilizar:
  
Como consequência, a partir de um programa em C, é possível abrir e escrever/ler em um dispositivo (desde que se tenha autorização).
+
//Parâmetros: print_display(linha,"mensagem");
  
===Acessando arquivos a partir de programas C===
+
print_display (int linha, char mensagem[]);
  
====Acesso a arquivos: funções de baixo e alto nível====
 
  
Em sistemas do porte do Linux e Windows, por questões de segurança e controle, todo acesso a arquivo é realizado através de código do sistema operacional. Desta forma, um programa que deseja acessar um arquivo deve gerar uma CHAMADA AO SISTEMA.
+
*Função "limpar_display" limpa o display
O Linux (assim como outros sistemas) possui uma API (Application Programming Interface) bem definida, na forma de um conjunto de chamadas que permitem realizar uma série de funcionalidades (serviços) para os processos(programas em execução).
+
/*Função utilizada para limpar o display*/
  
Um programa em C realiza uma CHAMADA AO SISTEMA com auxílio de funções da biblioteca C (a glib no caso do Linux).
+
como utilizar:
Duas categorias de funções para acesso a arquivo são disponibilizadas [http://en.wikipedia.org/wiki/C_file_input/output (ver detalhes aqui)]:
 
*Funções de baixo nível: acessam diretamente o sistema;
 
*Funções de alto nível: as funções intermediam o acesso, criando buffers no espaço de endereçamento do processo. As funções de baixo nível são invocadas para ler e escrever dados no buffer.
 
  
====Acesso a arquivo em MODO TEXTO através de funções de alto nível====
+
//Parâmetros: não possui
  
O acesso em alto nível é realizado usando uma estrutura do tipo [http://www.gnu.org/software/libc/manual/html_node/Streams.html#Streams FILE] definida no stdio.h.
+
limpar_display();
Todo acesso passa inicialmente por abrir o arquivo (função fopen), ler/escrever (várias funções, tipo fread(), fwrite()) e fechar o arquivo (fclose()).
 
  
 +
==Exemplos==
  
=====Exemplo 1: Escrevendo e lendo um arquivo texto de forma formatada=====
+
Sempre lembrando do arquivo de cabeçalho "bibprg.h" que está dentro da pasta que foi baixada
  
Nos exemplos que se seguem, serão usadas as funções [http://www.cplusplus.com/reference/cstdio/fopen/ fopen] e [http://www.cplusplus.com/reference/cstdio/fclose/?kw=fclose fclose], para abrir e fechar arquivo e [http://www.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf fprintf()] e [http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf fscanf()] para leitura e escrita.
+
Saída digital
A forma é similar ao ''printf'' e ''scanf''(ver http://diuf.unifr.ch/pai/ip/tutorials/c/TC02_scanf.pdf), a não ser pelo fato de que a escrita e leitura é realizada no arquivo indicado
 
por  ''p_arq''
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 +
#include "bibprg.h"
  
void main()
+
main (){
{
 
  FILE *p_arq;
 
  int i;
 
  int res;
 
  
  if ((p_arq=fopen("IFSC.txt", "w")) == NULL) {
+
char saida='1', estado='0';
    printf("Problemas na abertura do arquivo\n");
+
    return;
+
conectar ();
  }
+
   
 
+
enviar_digital ('1','1');
  for (i = 0; i<10;i++) {
+
sleep (1);
  /* A funcao fprintf devolve o número de bytes gravados ou EOF se houve erro na gravação */
+
enviar_digital (saida,estado);
      if((res = fprintf(p_arq,"Linha %d\n",i))==EOF) {       
+
}
        printf("Erro\n");
 
  break;
 
      }
 
  }
 
  fclose(p_arq);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Lembrando que o dois parâmetros são do tipo CHAR
  
Note que se o arquivo IFSC.txt não existir, ele será criado.
 
Para ver o que fois escrito faça:
 
cat IFSC.txt
 
  
 +
Saída analógica
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 +
#include "bibprg.h"
  
void main()
+
main (){
{
 
  FILE *p_arq;
 
  int i,j;
 
  int res;
 
  char buff[100];
 
  
  if ((p_arq=fopen("IFSC.txt", "r")) == NULL) {
+
char saida='1', estado[3]="000";
    printf("Problemas na abertura do arquivo\n");
 
    return;
 
  }
 
  
  for (i = 0; i<10;i++) {
+
conectar ();
      if((res = fscanf(p_arq,"%s %d",buff,&j))==EOF) {       
+
        printf("Fim de leitura\n");
+
enviar_analogica('1', "130");
  break;
+
sleep(2);
      }
+
enviar_analogica(saida, estado);
      printf("%s %d\n",buff,j);
+
}
  }
 
  fclose(p_arq);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Os dois parâmetros são do tipo CHAR, sendo o segundo uma cadeia de caracteres que varia de 000 á 255
  
Note que o fscanf se comporta de forma similar ao scanf. A função retorna o caracter EOF (end-of-file) quando não existe mais dados a serem lidos.
 
 
*Exercícios
 
 
#Implementar uma função que soma duas matrizes fornecidas em dois arquivos texto separados: MatA.dat e MatB.dat. Colocar o resultado em um arquivo chamado MatC.dat.
 
  
 +
Entrada digital
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
+
#include "bibprg.h"
void main()
 
{
 
  FILE *p_arq;
 
  int i,j,res;
 
  float MatA[5][5], MatB[5][5], MatR[5][5];
 
 
 
  /* Ler a matriz MatA do arquivo */
 
  if ((p_arq=fopen("MatA.dat", "r")) == NULL) {
 
    printf("Problemas na abertura do arquivo\n");
 
    return;
 
  }
 
 
 
  for (i =0;i<5;i++) {
 
      for (j=0;j<5;j++) {
 
      if((res = fscanf(p_arq,"%f",&MatA[i][j]))==EOF){     
 
        printf("Fim de leitura\n");
 
break;
 
      }
 
      printf("%f ",MatA[i][j]);
 
      }
 
      printf("\n");
 
  }
 
  fclose(p_arq);
 
 
 
  /* Ler a matriz MatB do arquivo */
 
  
  printf("\n\n");
+
main (){
     
 
  /* Ler a matriz MatB do arquivo */
 
  if ((p_arq=fopen("MatB.dat", "r")) == NULL) {
 
    printf("Problemas na abertura do arquivo\n");
 
    return;
 
  }
 
 
 
  for (i =0;i<5;i++) {
 
      for (j=0;j<5;j++) {
 
      if((res = fscanf(p_arq,"%f",&MatB[i][j]))==EOF){     
 
        printf("Fim de leitura\n");
 
break;
 
      }
 
      printf("%f ",MatB[i][j]);
 
      }
 
      printf("\n");
 
  }
 
  fclose(p_arq);
 
   
 
  /* Calcular a soma das matrizes e colocar resultado em MatR */
 
  
  for (i =0;i<5;i++) {
+
char saida='1';
      for (j=0;j<5;j++) {
 
      MatR[i][j]=MatA[i][j]+MatB[i][j];
 
      }
 
  }
 
  printf("Resultado da Adição\n");
 
  for (i =0;i<5;i++) {
 
      for (j=0;j<5;j++) {
 
          printf("%f ", MatR[i][j]); 
 
      }
 
      printf("\n");     
 
  } 
 
  /* Armazenar MatR em arquivo */
 
  
  if ((p_arq=fopen("MatR.dat", "w")) == NULL) {
+
conectar ();
    printf("Problemas na abertura do arquivo\n");
+
    return;
+
printf ("%d\n", receber_digital ('1'));
  }
+
sleep (3);
 
+
printf ("%d\n", receber_digital (saida));
  for (i =0;i<5;i++) {
+
}
      for (j=0;j<5;j++) {
 
        if((res = fprintf(p_arq,"%f ",MatR[i][j]))==EOF) {     
 
        printf("erro\n");
 
break;
 
      }
 
      }
 
      fprintf(p_arq,"\n");
 
  }
 
  fclose(p_arq);      
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
====Exemplo2====
+
Parâmetro do tipo CHAR
  
Neste exemplo usaremos as funções fgetc e fputc para ler e cescrever caracteres ASCII nos arquivos. Seja um programa que conta o número de ocorrências do caracter 'a' em um arquivo e reescreve o arquivo sem os "as":
 
  
 +
Entrada analógica
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 +
 
#include <stdio.h>
 
#include <stdio.h>
#include <stdlib.h>
+
#include "bibprg.h"
main()
 
{
 
  FILE *fp_fonte,*fp_destino;
 
  int x,cont=0;
 
                 
 
  if((fp_fonte=fopen("teste.dat","r")) == NULL) {
 
puts("Não conseguiu abrir o arquivo\n");
 
exit(1);
 
  }
 
  if((fp_destino=fopen("dest.dat","w")) == NULL){
 
puts("Não conseguiu abrir o arquivo\n");
 
exit(1);
 
  }
 
  
  /* note que fgetc retorna um inteiro contendo o ASCII lido */
+
main (){
  while ((x=fgetc(fp_fonte)) != EOF){
+
 
      if(x=='a')
+
conectar ();
        cont++;
+
      else
+
printf("%f\n",receber_analogica('1'));
if((x=fputc(x,fp_destino))==EOF) {
+
sleep (2);
puts("Não conseguiu abrir o arquivo\n");
+
printf("%f\n",receber_analogica('1'));
exit(1);
+
}  
}
 
  }
 
  printf("ocorrências de a = %d\n", cont);
 
  fclose(fp_fonte);
 
  fclose(fp_destino);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Parâmetro do tipo CHAR
  
Note que ''fputc'' recebe o caracter como um inteiro mas realiza um ''cast'' para
+
Display
''unsigned char'' com fins de escrevê-lo no arquivo.
 
  
====Exemplo 3====
+
<syntaxhighlight lang=c>
 +
#include <stdio.h>
 +
#include "bibprg.h"
  
Neste exemplo vamos explorar o modo de abertura do arquivo para fazer um append (escrever no final do arquivo).
+
main(){
  
<syntaxhighlight lang=c>
+
int i=12;
#include <time.h>
+
char mensagem[50]="Fim";
#include <stdio.h>
+
 +
conectar();
 +
 +
for(;;){
 +
    print_display (1,"Linha 1 display LCD");
 +
    sleep(1);
 
   
 
   
int main(void)
+
    print_display (2,"Linha 2 display LCD");
{
+
    sleep(1);
  time_t ltime;
+
 
  FILE *fp;
+
    print_display (12,"Linhas 1 e 2 display LCD");
  int num;
+
    sleep(1);
  
  time(&ltime);  
+
    print_display (i, mensagem);
 +
    sleep(1);
  
  if ((fp=fopen("DATA.txt", "a")) == NULL) {
+
}
      printf("Problemas na abertura do arquivo\n");
 
      return;
 
  }
 
  if ((num = fputs( ctime(&ltime), fp )) != EOF ) {
 
      fclose(fp);
 
  } else {
 
      printf("Erro na escrita do arquivo!\n");
 
  }
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Onde a variável "i" é do tipo inteiro e a "mensagem" é uma cadeia de caracteres
 +
 +
Ao fim, basta compilar da seguinte forma:
 +
 +
gcc arquivo.c -lprg -lusb-1.0 -o arquivo
 +
-->
 +
 +
<!--
 +
=Sensor de Temperatura LM35=
 +
 +
O LM35 é um sensor de temperatura linear que fornece 10mV para cada grau Celcius que medir. Ou seja, se está fornecendo 100mV, significa que ele está medindo 10°C. [http://blog.webtronico.com/?p=57 http://blog.webtronico.com]
 +
 +
;Principais características
 +
*Pode ser alimentado com uma tensão entre 4 e 20VDC;
 +
*Não necessita de calibração;
 +
*Sua precisão típica é de 0.5°C;
 +
*Pode medir temperaturas entre –55°C à 150°C.
 +
 +
;Veja o teste com LM35
 +
 +
<center>{{#ev:youtube|l9n-8wzex7I#!}} </center>
 +
 +
'''[SIC]''' graus Celsius, não centígrados.
 +
 +
Como sua saída é em tensão e pode ser ligado em 5V, serve como opção para trabalhar com nossas placas de I/O ou Arduíno para medidas de temperaturas.
 +
  
Execute o programa da forma (suponha que se chame LOG_tempo:
+
;A figura abaixo mostra a ordem dos pinos
  log_tempo
 
  cat DATA.txt
 
  log_tempo
 
  cat DATA.txt
 
  log_tempo
 
  cat DATA.txt 
 
 
 
*Exercício: Substitua o modo de append por uma simples escrita (w). Reexecute o programa conforme especificado anteriormente.
 
  
===Ainda funções de acesso a arquivos===
+
[[imagem:LM35-pin.png|300px]]
  
A localização corrente do acesso a um arquivo pode ser modificada antes de uma leitura ou escrita. Tipicamente, quando se abre
+
;A figura abaixo mostra o encapsulamento mais comum:
uma arquivo para leitura/escrita, o "cursor" de acesso é 0, ou seja início do arquivo. Se o arquivo for aberto em modo append, o "cursor" é posicionado no final. A cada acesso (leitura ou esrita), este cursor é incrementado conforme o número de dados lidos ou escritos.
 
  
É possível entretanto modificar a posição deste cursor, tipicamente com as funções ''fseek()'' e ''rewind()''. (ver http://www.gnu.org/software/libc/manual/html_node/File-Positioning.html#File-Positioning)
+
[[imagem:temperature-sensor-lm-35-dz.jpg]]
 +
-->
  
Considere o programa abaixo que escreve um vetor de 100 inteiros em um arquivo.
+
<!--
 +
=Como ligar um LED=
  
<syntaxhighlight lang=c>
+
;O que é um LED?
#include <stdio.h>
+
 
 +
É um Díodo Emissor de Luz, em inglês diz-se ''<b>L</b>ight <b>E</b>mitter <b>D</b>iode''. Pode ser usado para a emissão de luz em locais e equipamentos onde se torna conveniente a sua utilização em substituição a uma lâmpada. [http://pt.wikipedia.org/wiki/Diodo_emissor_de_luz Diodo Emissor de luz]
 +
 
 +
;Como projetar um circuito com LED?
 +
 
 +
Deve-se observar a característica físca do LED,e forma correta de polariza-lo.
  
int x[100];
+
A tabela abaixo mostra algumas características típicas entre os LEDs fabricados por diferentes
 +
empresas:
  
void main()
+
{| border="1" cellpadding="5" cellspacing="0" style="text-align: center;"
{
+
! style="background: #ffdead;" | Cor
  FILE *fp;
+
! style="background: #ffdead;" | Queda de tensão
 +
! style="background: #ffdead;" | Corrente
 +
|-
 +
!| Vermelho
 +
| 1.8V
 +
| 20mA
 +
|-
 +
!| Verde
 +
| 2.1V
 +
| 20mA
 +
|-
 +
!| Amarelo
 +
| 2.0V
 +
| 15mA
 +
|-
 +
!| Laranja
 +
| 2.0V
 +
| 20mA
 +
|-
 +
!| Azul
 +
| 3.1V
 +
| 20mA
 +
|-
 +
!| Branco
 +
| 3.1-4V
 +
| 20mA
 +
|-
 +
|}
  
  fp = fopen("teste.dat","w");
 
  x[0]=32;
 
  x[90]=11;
 
  fwrite(x, sizeof(int),100,fp);
 
  fclose(fp);
 
}
 
</syntaxhighlight>
 
  
Note que o vetor, sendo uma variável global não inicialiazada, será zerado pelo procedimento de ''startup'' do programa.
+
Vamos supor que pretende-se acender um LED vermelho, em uma fonte de 5V (USB, Arduído, Carregador de Celelular, placas I/O). Olhando na tabela ve-se que LED vermelho tem uma queda de 1.8V e uma corrente típica de 20mA. Falta portanto definir o resistor a ser utilizado.
Entretanto, a posição 90 recebe um valor (11).
 
  
Agora observe o programa seguinte que lê especificamente a posição 90 e na sequência restabelece o cursor no início. Note que o fread lê somente um inteiro na posição corrente do arquivo. A posição corrente foi determinada por ''fseek'' e depois retornada para o início com ''rewind''.
 
  
 +
Lei de ohm:
  
<syntaxhighlight lang=c>
+
:<math> V = R*I\, </math>
#include <stdio.h>
 
  
int y;
+
Portanto:
  
void main()
+
:<math> R = V/I\, </math>
{
 
  FILE *fp;
 
  
  fp = fopen("teste.dat","r");
+
:<math> R = (5-1.8)/0.02\, </math>
  fseek(fp, 90*sizeof(int), SEEK_SET);
 
  fread(&y, sizeof(int),1,fp);
 
  printf("y=%d\n", y);
 
  rewind(fp);
 
  fread(&y, sizeof(int),1,fp);
 
  printf("y=%d\n", y);
 
  fclose(fp);
 
}
 
</syntaxhighlight>
 
  
Exercício
+
:<math> R = 160 Ω\, </math>
 +
-->
  
Considere o programa abaixo. Ele deve acessar uma tabela que se encontra em um arquivo binário. Cada item da tabela
+
=Material complementar=
se apresenta conforme o registro TRegistro. Implemente a função ''LerTab'' e crie um programa para escrever uma tabela iniciada com
 
uma tabela de 5 registros a fim de testar a função implementada.
 
  
<syntaxhighlight lang= c>
+
http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html
#include <stdio.h>
 
  
struct TRegistro {
 
  char nome[30];
 
  int idade;
 
} Registro, *pAux;
 
  
struct TRegistro *LerTab(int indice)
 
{
 
}
 
  
void main()
+
{| border="1" cellpadding="5" cellspacing="0"
{
+
! style="background: #cdc5bf;" | [[AULA 20 - Programação 1 - Graduação | << ]]
  pAux=LerTab(3);
+
! style="background: #cdc5bf;" | Aula 21
  if (pAux!=0) {
+
! style="background: #cdc5bf;" | [[AULA 22 - Programação 1 - Graduação | >> ]]
      printf("Nome lido %s\n", pAux->nome);
+
|}
  }
 
}
 
</syntaxhighlight>
 

Edição atual tal como às 22h41min de 24 de junho de 2015

Requisito para formação das Equipes

  • Três integrantes por equipe.

Equipes do Projeto Final - Participantes

Equipe1-2015-1

  • MARIA FERNANDA SILVA TUTUI
  • RICARDO AMORIM
  • VITOR MANOEL DA SILVEIRA

Equipe2-2015-1

  • ADONIS ANDREAS MARINOS
  • ANDERSON GASPAR DE MEDEIROS
  • DANIEL TREVISAN TATSCH

Equipe3-2015-1

  • DANIEL CABRAL CORREA
  • PABLO FIDELIS DIAS
  • PAULO HENRIQUE HORST BIANCHIN

Equipe4-2015-1

  • ADILSON GOEDERT SIQUEIRA
  • GUSTAVO VIEIRA ZACCHI
  • RAPHAEL WASHINGTON BAPTISTA GIASSI

Equipe5-2015-1

  • LEONARDO TASCA
  • LUISA MACHADO
  • NATALIA ADRIANA MIRANDA

Equipe6-2015-1

  • AUGUSTO DA SILVEIRA WILLEMANN
  • GABRIEL FARIAS TURNES
  • JEFERSON RICARDO TICHZ ESPINDOLA

Equipe7-2015-1

  • JOAO VITOR DA ANUNCIACAO
  • RAISSA LINHARES GOMES
  • VICTOR CESCONETTO DE PIERI



Material complementar

http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html


<< Aula 21 >>