Você está na página 1de 39

Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Algoritmos e Estrutura de Dados II

Strings e Arquivos

P ONTIFÍCIA U NIVERSIDADE C ATÓLICA DE M INAS G ERAIS


Instituto de Ciências Exatas e Informática

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Agenda

1 Strings

2 Funções da biblioteca padrão

3 Arquivos Textos

4 Arquivos Binários

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings

Strings (Inglês) são cadeias ou sequências ordenadas de


caracteres.
Na verdade já trabalhamos com strings, mas preferimos
deixar maiores explicações para um momento em que já
tivesse sido introduzido o conceito de vetor.

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings
A linguagem C, ao contrário de outras linguagens de
programação, não possui um tipo de dados
correspondente às strings; no lugar, usam-se vetores
Em C, strings são vetores de caracteres terminados pelo
caractere nulo (’\0’). Por exemplo:

1 char nome[] = {’P’, ’e’, ’d’, ’r’, ’o’, ’\0’};

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings
A linguagem C, ao contrário de outras linguagens de
programação, não possui um tipo de dados
correspondente às strings; no lugar, usam-se vetores
Em C, strings são vetores de caracteres terminados pelo
caractere nulo (’\0’). Por exemplo:

1 char nome[] = {’P’, ’e’, ’d’, ’r’, ’o’, ’\0’};

No entanto, escrever strings dessa maneira é muito


trabalhoso; por isso, foi criada uma notação abreviada que
equivale à notação acima e elimina a necessidade de
colocar o caractere terminador:

1 char nome[] = "Pedro";

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings

Assim como nos vetores, podemos acessar e modificar


elementos individuais de uma string.
Podemos também diminuir o tamanho de uma string:
uma vez que a única marcação do tamanho é o terminador
\0, colocar um terminador em outro local determinará o
novo final da string

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings

A biblioteca padrão fornece várias funções úteis para


manipular strings.
A seguir mostraremos algumas delas.
Para usá-las, você deve incluir o cabeçalho string.h no
início dos seus arquivos.

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - strlen

strlen retorna o tamanho, em caracteres, de uma string


dada.
Na verdade o strlen() procura o terminador de string e
calcula a distância dele ao início da string.
Por exemplo:

1 char nome[15] = "Maria da Silva";


2 int s = strlen (nome);
3 // s contera o valor 14

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - strcpy

strcpy copia o conteúdo de uma string para outra e coloca


um terminador de string.
Sua sintaxe é strcpy (destino, origem).

1 char nome[] = "Clarice Lispector";


2 char nome2[] = "Oswald de Andrade";
3 strcpy (nome, nome2);
4 // agora nome contera "Oswald de Andrade"

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - strcat
strcat concatena duas strings, adicionando o conteúdo da
segunda ao final da primeira, além do terminador (\0).
Note que a primeira string deve ter espaço suficiente para
conter a segunda, para que não ocorra um "estouro de
buffer ".
Por exemplo:

1 char nome[50] = "Maria";


2 char sobrenome[] = " da Silva";
3 strcat (nome, sobrenome);
4 // agora nome contem "Maria da Silva"

Analogamente à função strncpy, existe também a função


strncat, onde o número máximo de caracteres a serem
copiados é o terceiro argumento.
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - strcmp
Se você tentar criar duas strings com o mesmo conteúdo e
compará-las como faria como números, verá que elas “não
são iguais”.
Isso ocorre porque, na verdade, o que está sendo
comparado são os endereços de memória onde estão
guardadas as strings.
Para comparar o conteúdo de duas strings, você deve usar
a função strcmp (ou suas variantes):

1 int strcmp (char *s1, char *s2);

O valor de retorno é:
menor que zero se s1 for menor que s2;
igual a zero se s1 e s2 são iguais;
maior que zero se s1 for maior que s2.
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - strcmp

Costuma parecer estranho dizer que uma string é menor


ou maior que outra;
na verdade essa comparação é entre a primeira letra que
difere nas duas strings.
Assim, se tivermos s1 = "abc"e s2 = "abd", diremos que s2
é maior que s1, pois na primeira posição em que as duas
strings diferem, a letra em s2 é “maior”.
É importante notar que a comparação feita por strcmp
distingue maiúsculas de minúsculas.
Isto é, as strings “ABC” e “abc” não são iguais para essa
função.

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - stricmp
A variante mais usada de strcmp é:
stricmp - compara duas strings sem distinção entre
maiúsculas e minúsculas. A sintaxe é igual à de strcmp.
Essa função não faz parte da biblioteca padrão, mas é
comumente encontrada como extensão particular de várias
delas.

1 char nome1[50] = "Maria da Silva";


2 char nome2[50] = "MARIA DA SILVA";
3 if(strcmp(nome1, nome2)==0)
4 cout << "\nNomes iguais!"
5 else cout << "\nNomes diferentes!"
6
7 if(stricmp(nome1, nome2)==0)
8 cout << "\nNomes iguais!"
9 else cout << "\nNomes diferentes!"

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - sprintf

A diferença entre printf e sprintf e que printf retorna o


resultado para a saída padrão (tela), enquanto sprintf
retorna o resultado em uma variável.
Isto é muito conveniente, porque você pode simplesmente
digitar a frase que você quer ter e sprintf lida com a própria
conversão e coloca o resultado na string que você deseja.
Sintaxe:

1 int sprintf(char *s, const char *formato, ...);

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Strings - sprintf

1 #include <stdio.h>
2 #include <string.h>
3 int main() {
4 char var[256];
5 char sobrenome[] = "Simpson";
6 char nome[] = "Homer";
7
8 int idade = 30;
9
10 sprintf(var, "%s %s tem %d anos",sobrenome, nome
, idade);
11
12 printf ("Resultado : %s\n", var);
13
14 return 0;
15 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Arquivos em C
Existem dois tipos possíveis de acesso a arquivos na linguagem C:
sequencial (lendo um registro após o outro) e aleatório
(posicionando-se diretamente num determinado registro)
Os arquivos em C são denominados fluxos (STREAM)
Um STREAM é associado a um arquivo por uma operação de abertura
do arquivo e, a partir da associação, todas as demais operações de
escrita e leitura podem ser realizadas
Na manipulação de um arquivo, há basicamente três etapas que
precisam ser realizadas:
1 abrir o arquivo;
2 ler e/ou gravar os dados desejados;
3 fechar o arquivo.
Em C, todas as operações realizadas com arquivos envolvem seu
identificador de fluxo, que é uma variável do tipo FILE *. Para
declarar um identificador de fluxo, faça como se fosse uma variável
normal:

1 FILE *arquivo; // nao se esqueca do asterisco!


Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Abrindo e fechando um arquivo

Não surpreendentemente, a primeira coisa que se deve


fazer para manipular um arquivo é abri-lo. Para isso,
usamos a função fopen(). Sua sintaxe é:

1 FILE *fopen (char *nome_do_arquivo, char *modo_de_acesso);

O nome do arquivo deve ser uma string ou com o caminho


completo (por exemplo, C: /Documentos/nomes.txt) ou o
caminho em relação ao diretório atual (nomes.txt) do
arquivo que se deseja abrir ou criar.
O modo de acesso é uma string que contém uma
sequência de caracteres que dizem se o arquivo será
aberto para gravação ou leitura.

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Abrindo e fechando um arquivo

Modo Significado

r Abre o arquivo somente para leitura. O arquivo deve existir.


r+ Abre o arquivo para leitura e escrita. O arquivo deve existir.
w Abre o arquivo somente para escrita no início do arquivo.
Apagará o conteúdo do arquivo se ele já existir,
criará um arquivo novo se não existir.
w+ Abre o arquivo para escrita e leitura, apagando o conteúdo pré-existente.
a Abre o arquivo para escrita no final do arquivo.
Não apaga o conteúdo pré-existente.
a+ Abre o arquivo para escrita no final do arquivo e leitura.

O valor de retorno da função fopen() é muito importante! Ele é o


identificador do fluxo que você abriu e é só com ele que você
conseguirá ler e escrever no arquivo aberto.
Se houver um erro na abertura/criação do arquivo, a função retornará o
valor NULL. O erro geralmente acontece por duas razões:
O arquivo não existe, caso tenha sido requisitado para leitura.
O usuário atual não tem permissão para abrir o arquivo com o modo de
acesso pedido. Por exemplo, o arquivo é somente-leitura, ou está
bloqueado para gravação por outro programa, ou pertence a outro usuário
e não tem permissão para ser lido por outros.

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Abrindo e fechando um arquivo

Ao terminar de usar um arquivo, você deve fechá-lo. Isso é feito pela função
fclose():

1 int fclose (FILE *fluxo);

O único argumento é o identificador do fluxo (retornado por fopen). O valor de


retorno indica o sucesso da operação com o valor zero.
Fechar um arquivo faz com que qualquer caractere que tenha permanecido no
"buffer"associado ao fluxo de saída seja gravado.
A função exit() fecha todos os arquivos que um programa tiver aberto.
A função fflush() força a gravação de todos os caracteres que estão no buffer
para o arquivo.

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Abrindo e fechando um arquivo


Exemplo

1 #include <stdio.h>
2
3 int main(){
4
5 FILE *arquivo;
6
7 arquivo = fopen ("README.txt", "w");
8
9 if (arquivo == NULL) {
10 printf ("Houve um erro ao abrir o arquivo.\n");
11 return 1;
12 }
13 printf ("Arquivo README criado com sucesso.\n");
14
15 fclose (arquivo);
16 return 0;
17 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Escrevendo em arquivos

Para escrever em arquivos, há 3 funções, as quais são


análogas às usadas para saída padrão:

Função Saída padrão Explicação


fputc putchar Imprime apenas um caractere.
fputs puts Imprime uma string diretamente, sem nenhuma formatação.
fprintf printf Imprime uma string formatada.

Protótipos dessas funções

1 void fputc (int caractere, FILE *fluxo);


2 void fputs (char *string, FILE *fluxo);
3 void fprintf (FILE *fluxo, char *formatacao, ...);

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fputc
Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *fp;
5 char string[100];
6 int i;
7 // abre arquivo ASCII, para escrita
8 fp = fopen("arquivo.txt","w");
9 if(!fp){
10 printf( "Erro na abertura do arquivo"); exit(0);
11 }
12 printf("Entre com a string a ser gravada no arquivo:");
13 gets(string);
14 //Grava a string, caractere a caractere
15 for(i=0; string[i]; i++)
16 putc(string[i], fp);
17 // fecha o arquivo
18 fclose(fp);
19 return 0;
20 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fputs
Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *fp;
5 char string[100];
6 // abre arquivo ASCII, para escrita
7 fp = fopen("arquivo.txt","w");
8 if(!fp){
9 printf( "Erro na abertura do arquivo"); exit(0);
10 }
11 printf("Entre com a string a ser gravada no arquivo:");
12 gets(string);
13 //Grava a string, caractere a caractere
14 fputs(string, fp);
15 // fecha o arquivo
16 fclose(fp);
17 return 0;
18 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fprintf
Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *fp;
5 char primeiro_nome[100],ultimo_nome[100];
6 // abre arquivo ASCII, para escrita
7 fp = fopen("arquivo.txt","w");
8 if(!fp){
9 printf( "Erro na abertura do arquivo"); exit(0);
10 }
11 printf("Digite seu primeiro nome: ");
12 gets(primeiro_nome);
13 printf("Digite seu ultimo nome: ");
14 gets(ultimo_nome);
15 //Grava a string, caractere a caractere
16 fprintf(fp, "%s, %s",ultimo_nome,primeiro_nome);
17 // fecha o arquivo
18 fclose(fp);
19 return 0;
20 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo de arquivos

Novamente, há três funções, as quais se assemelham às


usadas para a saída padrão:

Função Saída padrão Explicação


fgetc getchar Recebe apenas um caractere.
fgets gets Lê uma string (geralmente uma linha inteira).
fscanf scanf Recebe uma string formatada.

Protótipos dessas funções

1 int fgetc (FILE *fluxo);


2 void fgets (char *string, int tamanho, FILE *fluxo);
3 void fscanf (FILE *fluxo, char *formatacao, ...);

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fgetc
Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *fl;
5 int c;
6
7 if((fl = fopen("arquivo.txt", "r")) == NULL){
8 perror("Erro: fopen");
9 exit(EXIT_FAILURE);
10 }
11
12 while((c = fgetc(fl)) != EOF)
13 printf("Caractere lido: %c\n", c);
14
15 if((c == EOF) && (feof(fl) == 0) && (ferror(fl) != 0))
16 perror("Erro: fgetc");
17
18 fclose(fl);
19 return EXIT_SUCCESS;
20 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fgets
Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *fp;
5 char string[100];
6 // abre arquivo ASCII, para leitura
7 fp = fopen("arquivo.txt","r");
8 if(!fp){
9 printf( "Erro na abertura do arquivo"); exit(0);
10 }
11 // le dados do arquivo
12 fgets(string, 100, fp);
13 // imprimi os dados lidos
14 printf("%s\n", string);
15 // fecha o arquivo
16 fclose(fp);
17 return 0;
18 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fscanf
Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *fp;
5 char string[100];
6 // abre arquivo ASCII, para leitura
7 fp = fopen("arquivo.txt","r");
8 if(!fp){
9 printf( "Erro na abertura do arquivo"); exit(0);
10 }
11 // le e imprimi os dados do arquivo
12 while (!feof(fp)){
13 fscanf(fp,"%s",&string);
14 printf("String: %s\n",string);
15 }
16 // fecha o arquivo
17 fclose(fp);
18 return 0;
19 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo e Gravando Estruturas


Normalmente é necessário manipular arquivos de estruturas (struct)
Podemos por exemplo falar num arquivo de CLIENTES, onde cada
cliente possui CÓDIGO, NOME, ENDEREÇO e TELEFONE, como
podemos ler e gravar estes dados em um arquivo?

1 struct CLIENTE{
2 int codigo;
3 char nome[100];
4 char endereco[100];
5 char telefone[14];
6 };
7
8 struct CLIENTE clientes[10] = {
9 1, "Cliente 1", "Endereco 1", "(01)0000-0000",
10 2, "Cliente 2", "Endereco 2", "(02)0000-0000",
11 3, "Cliente 3", "Endereco 3", "(03)0000-0000",
12 4, "Cliente 4", "Endereco 4", "(04)0000-0000",
13 5, "Cliente 5", "Endereco 5", "(05)0000-0000",
14 6, "Cliente 6", "Endereco 6", "(06)0000-0000",
15 7, "Cliente 7", "Endereco 7", "(07)0000-0000",
16 8, "Cliente 8", "Endereco 8", "(08)0000-0000",
17 9, "Cliente 9", "Endereco 9", "(09)0000-0000",
18 10, "Cliente 10", "Endereco 10", "(10)0000-0000"};

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo e Gravando Estruturas


Gravando em formato texto
1 void grava_dados_texto(struct CLIENTE clientes[], int num_clientes){
2 FILE *arquivo;
3 int i;
4
5 if (( arquivo = fopen ("lista_clientes.txt", "w")) == NULL ){
6 printf (" Erro na abertura do arquivo ");
7 exit (1) ;
8 }
9
10 for(i=0; i<num_clientes;i++)
11 fprintf(arquivo,"%i\t%s\t%s\t%s\n",clientes[i].codigo,
12 clientes[i].nome,
13 clientes[i].endereco,
14 clientes[i].telefone);
15 fclose(arquivo);
16 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo e Gravando Estruturas


Lendo em formato texto
1 void ler_dados_texto(struct CLIENTE clientes[], int num_clientes){
2 FILE *arquivo;
3 int i;
4 if (( arquivo = fopen ("lista_clientes.txt", "r")) == NULL ){
5 printf (" Erro na abertura do arquivo ");
6 exit (1) ;
7 }
8 for(i=0; i<num_clientes;i++)
9 fscanf(arquivo,"%i\t%[^\t]\t%[^\t]\t%s",&clientes[i].codigo,
10 &clientes[i].nome,
11 &clientes[i].endereco,
12 &clientes[i].telefone);
13 fclose(arquivo);
14 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Escrevendo em arquivos

Escreve em arquivo binário:

Função Saída padrão Explicação


fwrite N/A Grava dados binários para um arquivo.

1 void fputc (int caractere, FILE *fluxo);


2 void fputs (char *string, FILE *fluxo);
3 void fprintf (FILE *fluxo, char *formatacao, ...);

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fwrite

Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *pf;
5 float pi = 3.1415;
6 //Abre arquivo binario para escrita
7 if((pf = fopen("arquivo.bin", "wb")) == NULL) {
8 printf("Erro na abertura do arquivo");
9 exit(1);
10 }
11 // Escreve a variavel pi
12 if(fwrite(&pi, sizeof(float), 1,pf) != 1)
13 printf("Erro na escrita do arquivo");
14 // Fecha o arquivo
15 fclose(pf);
16 return 0;
17 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo de arquivos

Lendo arquivo binários

Função Saída padrão Explicação


fread N/A Lê dados binários de um arquivo.

1 int fgetc (FILE *fluxo);


2 void fgets (char *string, int tamanho, FILE *fluxo);
3 void fscanf (FILE *fluxo, char *formatacao, ...);

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

fread
Exemplo
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 FILE *pf;
5 float pi = 3.1415;
6 //Abre arquivo binario para escrita
7 if((pf = fopen("arquivo.bin", "wb")) == NULL) {
8 printf("Erro na abertura do arquivo");
9 exit(1);
10 }
11 // Escreve a variavel pi
12 if(fwrite(&pi, sizeof(float), 1,pf) != 1)
13 printf("Erro na escrita do arquivo");
14 // Fecha o arquivo
15 fclose(pf);
16
17 // Abre o arquivo novamente para leitura
18 if((pf = fopen("arquivo.bin", "rb")) == NULL){
19 printf("Erro na abertura do arquivo");
20 exit(1);
21 }
22 // Le em pilido o valor da variavel armazenada anteriormente
23 if(fread(&pilido, sizeof(float), 1,pf) != 1)
24 printf("Erro na leitura do arquivo");
25 printf("\nO valor de PI, lido do arquivo e’: %f", pilido);
26 fclose(pf);
27 return 0;
Prof.
28 Kleber
} Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo e Gravando Estruturas


Normalmente é necessário manipular arquivos de estruturas (struct)
Podemos por exemplo falar num arquivo de CLIENTES, onde cada
cliente possui CÓDIGO, NOME, ENDEREÇO e TELEFONE, como
podemos ler e gravar estes dados em um arquivo?

1 struct CLIENTE{
2 int codigo;
3 char nome[100];
4 char endereco[100];
5 char telefone[14];
6 };
7
8 struct CLIENTE clientes[10] = {
9 1, "Cliente 1", "Endereco 1", "(01)0000-0000",
10 2, "Cliente 2", "Endereco 2", "(02)0000-0000",
11 3, "Cliente 3", "Endereco 3", "(03)0000-0000",
12 4, "Cliente 4", "Endereco 4", "(04)0000-0000",
13 5, "Cliente 5", "Endereco 5", "(05)0000-0000",
14 6, "Cliente 6", "Endereco 6", "(06)0000-0000",
15 7, "Cliente 7", "Endereco 7", "(07)0000-0000",
16 8, "Cliente 8", "Endereco 8", "(08)0000-0000",
17 9, "Cliente 9", "Endereco 9", "(09)0000-0000",
18 10, "Cliente 10", "Endereco 10", "(10)0000-0000"};

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo e Gravando Estruturas


Gravando em formato binário
1 void gravar_dados_binario(struct CLIENTE clientes[], int num_clientes){
2 FILE *arquivo;
3 int i;
4
5 if (( arquivo = fopen ("lista_clientes.dat", "wb")) == NULL ){
6 printf (" Erro na abertura do arquivo ");
7 exit (1) ;
8 }
9
10 fwrite(clientes,sizeof(struct CLIENTE),10,arquivo);
11
12 fclose(arquivo);
13 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Lendo e Gravando Estruturas


Lendo em formato binário
1 void ler_dados_binario(struct CLIENTE clientes[], int num_clientes){
2 FILE *arquivo;
3 int i;
4
5 if (( arquivo = fopen ("lista_clientes.dat", "rb")) == NULL ){
6 printf (" Erro na abertura do arquivo ");
7 exit (1) ;
8 }
9
10 fread (clientes , sizeof ( struct CLIENTE ), 10,arquivo);
11
12 fclose(arquivo);
13 }

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II


Strings Funções da biblioteca padrão Arquivos Textos Arquivos Binários

Dúvidas?

Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II

Você também pode gostar