Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
CC Para Para Bruno Jurkovski Fábio da Fontoura Beltrão Felipe Augusto Chies Kauê Soares da Silveira Lucas Fialho Zawacki Marcos Vinicius Cavinato Para Para EngenhariasEngenharias Revisão da Aula 5 � Dados Estruturados �Na última aula aprendemos como definir nossos próprios tipos de dados. Estes nossos próprios tipos de dados. Estes consistem de estruturas formadas por tipos de dados mais simples. �Por exemplo... Revisão da Aula 5 typedef struct vetor3d { int x, y, z; }VETOR3D; /* Função que retorna 1 se os vetores são iguais e 0 caso contrário */ int compara_vetor (VETOR3D v1, VETOR3D v2) { if ( v1.x == v2.x && v1.y == v2.y && v1.z == v2.z ) return 1; else return 0; } Revisão da Aula 5 int main() { VETOR3D v1 = { 0 , 0, 1 }; VETOR3D v2 = { 0 , 0 ,0 }; VETOR3D v3 = v2; if (compara_vetor(v1,v2)) puts(“v1 e v2 sao iguais\n”); if (compara_vetor(v2,v3)) puts (“v2 e v3 sao iguais\n”); } Entrada e saída por arquivos �A E/S de arquivos em C é feita por Streaming. �Streams são fluxos de dados e podem ser de dois tipos: �Streams de texto �Streams binários Estruturas FILE � Para abrirmos um Stream e assim manipularmos arquivos, temos que declarar uma variável do tipo FILE. FILE *arquivo; Estruturas FILE � Para abrir o arquivo usamos a função : � fopen (“nome”, “modo”) � Que retorna um ponteiro para FILE. FILE *arquivo; arquivo = fopen (“novo.txt”, “w”); Estruturas FILE � A função retornará o valor NULL caso ocorra algum erro ao acessar o arquivo, por isso é melhor fazer um teste para por isso é melhor fazer um teste para confirmar se a operação obteve êxito. FILE *arquivo; arquivo = fopen (“novo.txt”, “w”); if (arquivo) { printf(“Arquivo aberto com sucesso”);printf(“Arquivo aberto com sucesso”); /* Mexendo no arquivo M.. */ } else { printf(“Erro ao abrir arquivo”); /* Tratando o erro M */ } Modos de abertura de arquivo � O segundo parâmetro da função é uma string contendo um dos seguintes códigos, os quais determinam o modo de abertura..abertura.. Código Significado r Abre arquivo-texto para leitura (deve existir) w Cria arquivo-texto para escrita (apaga se já existir) a Anexa a um arquivo-texto (cria se não existir) r+ Abre arquivo-texto para leitura/escrita (deve existir) w+ Cria arquivo-texto para leitura/escrita (apaga se já existir) a+ Anexa arquivo-texto para leitura/escrita (cria se não existir) � Um exemplo de como podemos criar e editar um arquivo de texto é o seguinte: FILE *texto; texto = fopen (“texto.txt”, “w”); char a; if (texto)if (texto) { while (a != 13) // 13 é o ASCII para ENTER { a = getche(); fputc(a, texto); } fclose(texto); } � Notem que usamos a função: � fclose(FILE *arq) � Ela fecha o stream que lhe é passado � Ela fecha o stream que lhe é passado como parâmetro. É extremamente recomendado fechar o arquivo depois de usá-lo. � Algumas funções essenciais para manipulação de arquivos de texto são: � fputs(char *info, FILE *arq) � Mesmo uso que puts, mas escrevendo no stream do arquivo. � fgets(char *info, int n, FILE *arq) � Lê ‘n’ caracteres do arquivo e guarda-os na string enviada. A � Lê ‘n’ caracteres do arquivo e guarda-os na string enviada. A função pára caso chegue ao fim de uma linha. � fprintf(FILE *arq, char *info, <parâmetros>) � Usado exatamente como um printf, porém agora a string é impressa no arquivo. � fscanf(FILE *arq, char *info, <variáveis> ) � Igual ao scanf. Os dados serão lidos seqüencialmente do arquivo e colocados nas variáveis. � char fgetc(FILE* arq) � Esta função lê um caracter do arquivo passado como parâmetro e o retorna. Portanto é preciso colocá-lo numa variável. � fputc(char a, FILE *arq) � Escreve o caracter no arquivo, bem simples. � int feof(FILE *arq)int feof(FILE *arq) � Retorna 1 se o arquivo tiver terminado; � Muito usado em laços para varrer um arquivo até o seu fim; � fflush(FILE *arq) � Garante que as escritas terminem. Exercício � Faça uma função que receba dois ponteiros para FILE e que copie o conteúdo do primeiro arquivo para o conteúdo do primeiro arquivo para o segundo. � Dois exemplos de como podemos copiar um arquivo para outro: void copia (FILE *origem, FILE *destino) { char a; void copia (FILE *origem, FILE *destino) { char string[256];char a; a = fgetc (origem); while (!feof (origem)) { fputc (a, destino); a = fgetc (origem); } fflush (destino); } char string[256]; fgets (string, 256, origem); while (!feof (origem)) { fputs (string, destino); fgets (string, 256, origem); } fflush (destino); } Stream stdin � Em todo programa escrito em c que inclui o stdio.h, existe uma variável chamada stdin do tipo FILE * que representa a stdin do tipo FILE * que representa a entrada padrão (geralmente o teclado). � Assim, podemos usar as funções de manipulação de arquivos para ler dados do teclado. Stream stdout � Analogamente, o stdio.h define uma variável chamada stdout, também do tipo FILE * que representa a saída padrão FILE * que representa a saída padrão (comumente a tela). � Portanto, podemos manipular a tela utilizando as funções específicas para arquivos. Exercícios � Utilize a função criada no exercício anterior para fazer um programa que mostra o conteúdo de um arquivo na tela.mostra o conteúdo de um arquivo na tela. � Faça um programa que salva os dados digitados pelo usuário num arquivo, também utilizando a função do exercício anterior. main() { char nomeArq[256]; printf(“Digite o nome do arquivo:”); scanf(“%s”, nomeArq); arq = fopen(nomeArq, “r”); if(arq) {if(arq) { copia(arq, stdout); } else { printf(“Nao foi possivel abrir o arquivo %s!”, nomeArq); } } main() { char nomeArq[256]; printf(“Digite o nome do arquivo:”); scanf(“%s”, nomeArq); arq = fopen(nomeArq, “w”); if(arq) {if(arq) { printf (“Digite o texto (Ctrl + c para sair):\n“) copia(stdin, arq); } else { printf(“Nao foi possivel abrir o arquivo %s!”, nomeArq); } } Modos de abertura de arquivo � Estes modos são para a abertrura de arquivos binários. Código Significado rb Abre arquivo-binário para leitura (deve existir) wb Cria arquivo-binário para escrita (apaga se existir) ab Anexa a um arquivo-binário (cria se não existir) r+b Abre arquivo-binário para leitura/escrita (deve existir) w+b Cria arquivo-binário para leitura/escrita (apaga se existir) a+b Anexa/cria arquivo-binário para leitura/escrita (cria se não existir) � Quando usamos um stream binário, estamos transferindo bits de informação, isso nos propicia manipular tipos primitivos e estruturas em arquivos. � É muito útil salvar dados em arquivos binários, por diversos motivos: � Tamanho reduzido; � Facilidade de manipulação; � Arquivos não acessíveis ao usuário. � Algumas funções úteis ao se manipular arquivos binários: � fwrite(void *pt_dados,int tamanho, int n, FILE *arq) � Escreve o dado apontado por pt_dados, no arquivo; � Note que temos que passar o tamanho do dado em bytes e também quantos queremos escrever (no caso de um vetor)de um vetor) � fread(void *pt_destino,int tamanho, int n, FILE *arq) � Lê ‘n’ estruturas do arquivo e salva em pt_destino ; � Neste caso também precisamos passar o tamanho da estrutura em bytes. � fseek(FILE *pt_dados, int salto, <POSICAO>) �Modifica a posição de leitura/escrita em pt_dados; � Através do parâmetro salto, informamos em quantos bytes a posição será modificada; � <POSICAO> determina o referencial. Pode ser:<POSICAO> determina o referencial. Pode ser: � SEEK_SET: início do arquivo; � SEEK_CUR: posição atual; � SEEK_END: fim do arquivo. Exercícios �Faça uma estrutura a seu gosto que caracterize um aluno da UFRGS. Faça uma função que leia os seus dados e uma função que leia os seus dados e armazene-os em um arquivo via binária; �Leia seus dados do arquivo e imprima-os na tela;