Logo Passei Direto
Buscar

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;

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Mais conteúdos dessa disciplina

Mais conteúdos dessa disciplina