Variáveis transientes e persistentes • Programas executando lidam com variáveis – forma abstrata pela qual os programadores enxergam os dados que seus programas manipulam. – internamente, variáveis ocupam células de memória. • usualmente o tipo inteiro de C corresponde a 32 bits • uma variável int em C ocupa 4 bytes (4 células de memória). • A memória principal de um computador (RAM) é o local onde os programas em execução, e as variáveis que eles utilizam, são armazenados. 2 Variáveis transientes e persistentes • Essas variáveis armazenadas na memória principal – são chamadas de variáveis transientes – seu tempo de existência é limitado pelo tempo que o programa se encontra em memória. • Quando o usuário ou o SO decidirem finalizá-lo, essas variáveis deixarão de existir. • Computadores teriam sua utilidade muito reduzida se os dados só pudessem ser armazenados enquanto os programas estivessem na memoria principal (e a maquina, ligada). 3 Variáveis transientes e persistentes • Variáveis persistentes – conteúdo armazenado, e possível de ser acessado, independentemente do programa que as criou estar na memória principal. – variáveis persistentes são armazenadas em algum dispositivo de memória chamada de secundária: • como discos rígidos, CD/DVD, memória flash • mantém por um longo tempo os dados neles contidos • independe do conteúdo da memória do computador, ou mesmo de ele estar ligado. • ressalta-se que o tempo de armazenamento de, e acesso a dados usando dispositivos de memória secundária é muito maior que usando a memória principal! 4 Variáveis transientes e persistentes • O conceito por trás das variáveis persistentes é o de arquivo – por meio de arquivos, as variáveis podem ser armazenadas e seus dados acessados e processados a qualquer tempo, tanto pelo programa que as criou quanto por outros programas. 5 Tipos de arquivos • Texto – arquivo texto é uma sequência de caracteres – dados armazenados de tal forma que em C são armazenados em variáveis do tipo char. – um arquivo texto aberto num editor de texto convencional, poder ter seu conteúdo ao menos visualizado e modificado também ... (com caracteres que façam sentido, ou não! ...) 6 Tipos de arquivos • Binário – Espelho do conteúdo da memória – Comando específico de leitura e escrita – Exemplo 1 2 3 4 5 struct pessoa { char nome[50]; int idade; float salario; } 50 bytes que armazenam cada uma das variáveis char, mais 32 bits (4 bytes) que armazenam uma variável int, e mais 32 bits (4 bytes) que armazenam uma variável float. 7 Definição de arquivos no programa • os arquivos são tratados como variáveis • como todas as outras variáveis, devem ser declarados • podem ser usados como argumentos para funções • existem funções para realizar todas as operações sobre arquivos na linguagem C o tipo FILE, definido na biblioteca stdio.h, é usado para se trabalhar com arquivos. 1 2 FILE *arq; Um ponteiro para FILE deve ser declarado sempre que uma variável arquivo for utilizada no programa. 8 Operações sobre arquivos 1 2 3 /* Protótipo da função de abertura de arquivos */ FILE *fopen (char *nomearq, char *modo); Parâmetros: ponteiro para char – nomearq (nome do arquivo físico) outro ponteiro para char com o modo de uso do arquivo e tipo. 1 2 3 4 5 /* Exemplo */ FILE *arq1 , *arq2; arq1 = fopen ("somente_escrita.txt", "w"); arq2 = fopen ("leio_e_escrevo.meu", "r"); 9 Definição de arquivos no programa • a função fopen() – avaliação de seu valor de retorno. – erros na abertura de um arquivo • ex: passar para fopen() o código “r”, mas o arquivo não existe – retorno de fopen() é NULL indicando a falha na abertura do arquivo 1 2 3 4 5 6 FILE *arq; arq = fopen ("alunos.txt", "r"); if (arq == NULL) { printf ("Erro na abertura de arquivo! Programa terminado..."); exit (1); } exit() é uma função da biblioteca stdlib.h da linguagem C, que retorna o controle ao SO, passando um código de retorno, e terminando o programa. 10 Fechamento de arquivos • retorna zero se a operação terminou sem falhas • caso contrário, retorna um valor diferente de zero • recebe como parâmetro um ponteiro para FILE • quando fclose() é usada, os dados pendentes na “buffer” do arquivo são escritos e o arquivo físico é dissociado de FILE* 1 2 3 /* Protótipo da função de fechamento de arquivos */ int fclose (FILE *arq); 11 Operações com arquivos texto • Operações de leitura – fscanf(), fgets() • A primeira parece com uma velha conhecida: scanf() • A segunda será apresentada, para quem ainda não conhece 1 2 3 4 5 /* Protótipos das funções de leitura de arquivos texto*/ int fscanf ( FILE *fp, const char *format, ... ); char *fgets (char *str, int length, FILE *fp); 12 Uso de fscanf(..) fscanf() para de ler a linha quando encontra o fim da linha. Neste caso, cada variável lida. Por este motivo esta função não é indicada para leitura de strings que possam ter um fim de linha em seu conteúdo. 13 Uso de fgets(..) 14 Operações com arquivos texto • Operações de escrita – fprintf() • Parece com uma velha conhecida: printf() 1 2 3 4 /* Protótipo da função de escrita de arquivos texto*/ int fprintf ( FILE *fp, const char *format, ... ); 15 Uso de fprintf(...) 16 Algumas funções úteis • feof() – verificação de fim de arquivo A função que recebe como parâmetro o ponteiro associado a um arquivo já aberto (via fopen), retorna zero se o arquivo ainda não chegou ao fim; 1 2 3 /* Protótipos da função feof() */ int feof(FILE *fp); 17