Buscar

Aula27 ArquivoTXT emC2

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 38 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 38 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 38 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Arquivo Texto Arquivo Texto vsvs BinárioBinário
ARQUIVO TEXTO
• dados: caracteres (1 byte (8 bits) cada)
• organizado em linhas de tamanho variável• organizado em linhas, de tamanho variável
ARQUIVO BINÁRIO
• dados: estruturados e dados simples dados: estruturados e dados simples 
(cada elemento pode conter mais de 1 byte)
• organizado em blocos, em bytes...
COMPARAÇÃO:
pegando-se um número inteiro (de 32 bits), com 88 dígitos...
No arquivo texto terá:q
sizeof(char)*88 = 64 bits
No arquivo binário terá:
sizeof(int) = 32 bits { do mesmo jeito que
1
está na memória! }
Arquivo TextoArquivo Texto
• elemento/posição corrente:
linh- linha
- caractere
• marcador de final de linha:• marcador de final de linha:
- uso pela linguagem C: “\n”
- em Unix, Linux, AIX, Xenix, Mac OS X, BeOS, ...: LF (line feed)
- em Commodore Apple II e até Mac OS 9: CR (carriage return)em Commodore, Apple II e até Mac OS 9: CR (carriage return)
- em DOS, OS/2, Microsoft Windows: CR+LF
Obs.: o sistema operacional converte o \n para seu padrão de fim de linha!
• marcador de final de arquivo:
- caractere EOF
arqu.txt
⌫⌫ESTE EH UM TEXTO EXEMPLO EBLABLABLA
⌫⌫
⌫⌫⌫⌫
2
⌫⌫
EOF
FINAL DE 
LINHA
Comandos de manipulaçãoComandos de manipulação
fopen (<nome do arquivo>,<modo de abertura>)
Nome do arquivo em 
disco
“r” – abre um arquivo texto para leitura
“w” – cria/recria um arquivo texto para escrita
“a” – acrescenta ao fim de um arquivo texto
existente
Modo de abertura
“r+” – abre um arquivo texto para leitura/escrita
“w+” – cria/recria um arquivo texto para
leitura/escrita
“a+” – acrescenta em/cria um arquivo texto
para leitura/escrita
Abre/cria/recria um arquivo com o nome e modo passados.
Obs.: a função retorna um apontador para uma estrutura FILE!Obs.: a função retorna um apontador para uma estrutura FILE!
para leitura/escrita
Ex:Ex: #include <stdio.h> /* contém definições e funções p/ uso e manipulação de streams */
#include <stdlib.h>
void main(){
FILE *arq; /* declaração de arquivo*/
arq = fopen(“exemplo.txt”,”r”); /*abertura para leitura */q p ( p , ); / p /
if (!arq) /* retorno NULL indica erro na abertura */
printf(“Erro na abertura do arquivo.”);
} 
3
fclose (<apontador para FILE>)
F h d iFecha um stream de arquivo
Obs.: ao fechar o stream do arquivo todos os dados
que ainda estavam em buffer serão salvos em discoque ainda estavam em buffer serão salvos em disco.
fflush (<apontador para FILE>)
Descarrega o conteúdo em buffer para o arquivo
sem fechar o stream
putc (<caractere>,<FILE *>)
Escreve um caractere no arquivoEscreve um caractere no arquivo
getc (<FILE *>)getc (<FILE *>)
Retorna um caracter lido do arquivo
4
Extração de elementos variados de linhas Extração de elementos variados de linhas 
de um arquivo de um arquivo txttxt
Função fgets
qq
• Permite a leitura de uma linha do arquivo como string.
• Formato:
vetorchar: onde conteúdo da linha será armazenado – até o \n
fgets(vetorchar, sizevetor, point_arq );
vetorchar onde conteúdo da l nha será armazenado até o \n
sizevetor : número máximo de bytes em vetorchar
point_arq : arquivo de onde será feito a leitura
• Exemplo:
fgets(buffertxt,MAX,arq); // string lida de arq é armazenada no vetor
Extração de elementos de linhas de Extração de elementos de linhas de 
um arquivo texto um arquivo texto 
Função atoi
• Transforma o conteúdo de um vetor de caracteres em inteiro• Transforma o conteúdo de um vetor de caracteres em inteiro.
• Formato:
atoi(vetorchar);
vetorchar: conteúdo a ser convertido
• Exemplo:
ato (vetorchar);
...
char str1[5]={"12"};
char str2[5]={'1','2'};[ ] { , }
char str3[5]={'0'};
printf(" int 1 = %d",atoi(str1));
printf(" int 2 = %d",atoi(str2));
i tf(" i t 3 %d\ " t i( t 3))printf(" int 3 = %d\n",atoi(str3));
...
Extração de elementos de linhas Extração de elementos de linhas 
de um arquivo texto de um arquivo texto 
Função atof
• Transforma o conteúdo de um vetor de caracteres em realTransforma o conteúdo de um vetor de caracteres em real.
• Formato:
atof(vetorchar);
vetorchar: conteúdo a ser convertido
• Exemplo:
( )
char str4[8]={"12.3674"};
char str5[5]={'.','1','2'};
char str6[5]={'0'};char str6[5]={ 0 };
printf(" int 4 = %f",atof(str4));
printf(" int 5 = %f",atof(str5));
printf(" int 6 = %f\n" atof(str6));printf( int 6 = %f\n ,atof(str6));
Extração de elementos variados de linhas Extração de elementos variados de linhas 
de um arquivo de um arquivo txttxt
Função strtok
• Extrai substrings (tokens) sucessivos de uma string, desde queg ( ) g, q
separados por um separador diferente de branco.
• Formato:
• Exemplo:
strtok(vetorchar,”símbolo_separador” );
// especifica o string inicial só na primeira extração: 
strcpy (sub1, strtok(buffertxt,”,”));
strcpy ( sub2 strtok(NULL ” ”));
• O nome do vetor é usado na função strtok apenas para extrair a 
strcpy ( sub2, strtok(NULL, , ));
strcpy ( sub3, strtok(NULL,”,”));
f ç p p
primeira substring. Para a extração das demais substrings de uma 
mesma string, deve-se usar a constante NULL como primeiro 
parâmetro das chamadas subsequentes de strtok ( enquanto a stringparâmetro das chamadas subsequentes de strtok ( enquanto a string
base for a mesma, strtok segue avançando pelas posições da string ).
Extração de elementos de linhas Extração de elementos de linhas 
de um arquivo texto de um arquivo texto 
Função strtokç
• Formato: strtok(vetorchar,”símbolo_separador” );
vetorchar: conteúdo a ser analisado
• Exemplo:char linha[36]={"parte1#outra parte#ultima parte#"}; p [ ] { p p p }
printf("token 1 - %s\n", strtok(linha,"#")); //extrai primeira substring
printf("token 2 - %s\n", strtok(NULL,"#")); //extrai próxima substring
printf("token 3 - %s\n", strtok(NULL,"#")); //extrai próxima substring
Extração de elementos variados de Extração de elementos variados de 
linhas de um arquivo linhas de um arquivo txttxt
Exemplo, incluindo atoi e atof:
num1 = atoi(strtok(buf,","));
strcpy(substring , strtok(NULL, “,”));
2 t i( b t i 1)num2 = atoi(substring1);
real1 = atof(strtok(buf,","));
strcpy(substring , strtok(NULL, “,”));
real2 = atof(substring1);
Exemplo Exemplo 11
Desenvolver um programa em C contendo uma função void
ConvertePontuacao( FILE *p_out, int vet_ptos[ ]), que abre
“ ê éum arquivo texto “out.txt”, composto de sequências de até 3
dígitos numéricos sucedidos por um asterisco,
sucessivamente (até encontrar EOF), e converte cada( ),
sequência em um número inteiro, o qual é armazenado no
vetor parâmetro (inserir -1 no elemento do vetor que sucede
o último valor convertido, como sinalizador de elementoo último valor convertido, como sinalizador de elemento
final), fecha o arquivo e devolve o vetor preenchido.
Slide 11
// converte txt em vetor de inteiros: SOLUÇÃO 1 – lê caractere
#include <stdlib.h>
#include <stdio.h># nclude std o.h
#include <string.h>
FILE *p_out;
void ConvertePontuacao( FILE *p_out, int vet_ptos[])
{{
char caractere= ‘ ‘, str_aux[4]; // armazena dígitos para conversão
int i_vet=0, i_aux=0;
while (caractere != EOF ) // foi inicializado com branco!w ( E F ) // f z m
{
caractere = getc(p_out); // lê caractere a caractere
switch (caractere)
{{
case '*' : ......
case EOF : break; 
próximo 
slide;
default: .....
}
}}
vet_ptos[i_vet] = -1; // sinalizador de fim de valores convertidos
}
} // fim da função
Slide 12
} ç
.....
while (caractere != EOF ) // foi inicializado com branco!
{{
caractere = getc(p_out); // lê caractere
switch (caractere)
{
 '*' // i di fi d ê i d úcase '*': // indica fim de sequência de números
str_aux[i_aux] = '\0'; // insere finalizador de string
printf("\nString gerado: %s",str_aux);
vet ptos[i vet] = atoi(straux); //converte para inteirovet_ptos[i_vet] = atoi(str_aux); //converte para inteiro
printf("\nNro convertido = %d",vet_ptos[i_vet]);
i_aux = 0; // prepara para reiniciar o preenchimento
i vet++; // posiciona no próximo elemento do vetor i_vet ; // posiciona no próximo elemento do vetor 
break;
case EOF : break; 
default: str_aux[i_aux] = caractere;
i_aux++;
}
}
vet ptos[i vet] = 1; // sinalizador de fim de valores convertidosvet_ptos[i_vet] = -1; // sinalizador de fim de valores convertidos
fclose (p_out);
......
Slide 13
// converte txt em vetor de inteiros: SOLUÇÃO 2 – lê linha
#include <stdlib.h>
#include <stdio.h># nclude std o.h
#include <string.h>
FILE *p_out;
void ConvertePontuacao( FILE *p_out, int vet_ptos[])
{{
char stringao[256]; // armazena linha lida
int i_vet=0, i_aux=0, cont_ast=0;
if (fgets (stringao, sizeof(stringao), p out)== NULL)f (fg ( g , z f( g ), p_ u ) N LL)
printf("\n Não leu nada!");// foi inicializado com branco!
else
{{
for (i_aux=0; i_aux< strlen(stringao); i_aux++) 
if (stringao[i_aux]=='*') // conta separadores da linha
cont ast++;cont_ast++;
vet_ptos[i_vet] = atoi(strtok(stringao,"*")); // extrai 1º número
for (i_aux=1; i_aux< cont_ast; i_aux++)
t t [i t] t i( t t k(NULL "*")) // t i tvet_ptos[i_vet] = atoi(strtok(NULL,"*")); // extrai os outros
}
vet_ptos[i_vet] = -1; // sinalizador de fim de valores convertidos
} // fi d f ã
Slide 14
} // fim da função
int main()
{{
int ptos[50], i_p=0; // vetor de pontuação e índice
if ((p_out = fopen("out.txt", "r")) != NULL)
{ { 
ConvertePontuacao(p_out, ptos);
fclose (p_out);
printf("\n\nVetor resultante da conversao:\n"); printf( \n\nVetor resultante da conversao:\n ); 
while (ptos[i_p] != -1)
{
i tf(" %d " t [i ])printf(" %d ",ptos[i_p]);
i_p++;
}
else
printf ("\nNao encontrou o arquivo!\n") ;
return 0;
} 
Slide 15
Slide 16
Exemplo Exemplo 22
Desenvolver um programa em C contendo uma função void
ConvertePontuacao( FILE *p_out, int vet_ptos[ ]), que abre
“ l hum arquivo texto “textoout.txt”, composto de linhas com
sequências de até 3 dígitos numéricos sucedidos por um
asterisco, sucessivamente (até encontrar \n e EOF), e, ( ),
converte cada sequência em um número inteiro, o qual é
armazenado no vetor parâmetro (inserir -1 no elemento do
vetor que sucede o último valor convertido, como sinalizadorvetor que sucede o último valor convertido, como sinalizador
de elemento final), fecha o arquivo e devolve o vetor
preenchido.
Slide 17
// converte txt em vetor de inteiros: Solução lendo caractere a caractere
#include <stdlib.h>
#include <stdio.h># nclude std o.h
#include <string.h>
FILE *p_out;
void ConvertePontuacao( FILE *p_out, int vet_ptos[])
{{
char caractere= ‘ ‘, str_aux[4]; // armazena dígitos para conversão
int i_vet=0, i_aux=0;
while (caractere != EOF ) // foi inicializado com branco!w ( E F ) // f z m
{
caractere = getc(p_out); // lê caractere a caractere
switch (caractere)
{{
case '*' : ......
case EOF : break;
próximo 
slide;case ‘\n’: break; // ignora quebra de linha
default: .....
}
slide
}
}
vet_ptos[i_vet] = -1; // sinalizador de fim de valores convertidos
}
Slide 18
}
} // fim da função
.....
while (caractere != EOF ) // foi inicializado com branco!
{{
caractere = getc(p_out); // lê caractere
switch (caractere)
{
 '*' // i di fi d ê i d úcase '*': // indica fim de sequência de números
str_aux[i_aux] = '\0'; // insere finalizador de string
printf("\nString gerado: %s",str_aux);
vet ptos[i vet] = atoi(str aux); //converte para inteirovet_ptos[i_vet] = atoi(str_aux); //converte para inteiro
printf("\nNro convertido = %d",vet_ptos[i_vet]);
i_aux = 0; // prepara para reiniciar o preenchimento
i vet++; // posiciona no próximo elemento do vetor i_vet ; // posiciona no próximo elemento do vetor 
break;
case EOF : break; 
case ‘\n’ : break; // ignora quebra de linha
d f l 
g q
default: str_aux[i_aux] = caractere;
i_aux++;
}
}}
vet_ptos[i_vet] = -1; // sinalizador de fim de valores convertidos
fclose (p_out);
Slide 19
......
// converte txt em vetor de inteiros – Solução lendo linha
#include <stdlib.h>
#include <stdio.h>
#include <string h>#include <string.h>
FILE *p_out;
void ConvertePontuacao( FILE *p_out, int vet_ptos[])
{
char caractere = ' ' str aux[4]; // armazena dígitos para conversãochar caractere = , str_aux[4]; // armazena dígitos para conversão
char buf_txt[256]; 
int i_vet=0, i_aux=0, i_t;
while(! feof(p_out)) 
{ 
( (p ))
{ 
if (fgets(buf_txt,sizeof(buf_txt),p_out)== NULL) // lê linha
printf("\nChegou ao fim do arquivo");
elseelse
{ 
for (i_t=0;i_t<strlen(buf_txt);i_t++) 
{ switch (buf_txt[i_t])
{ // ó i lid }{ ... // próximo slide }
i_aux++;
}
i aux = 0; // prepara para reiniciar o preenchimentoi_aux 0; // prepara para reiniciar o preenchimento
printf("\n"); 
}
}
vet ptos[i vet] 1; // sinalizador de fim de valores convertidos
Slide 20
vet_ptos[i_vet] = -1; // sinalizador de fim de valores convertidos
} // fim da função
else
{ 
f ( l (b f ) ) for (i_t=0;i_t<strlen(buf_txt);i_t++) 
switch (buf_txt[i_t])
{
 '*' // d f d ê d úcase '*': // indica fim de sequência de números
str_aux[i_aux] = '\0'; // insere finalizador de string
printf("\nString gerado: %s",str_aux);p g g
vet_ptos[i_vet] = atoi(str_aux); //converte
printf("\nNro convertido = %d",vet_ptos[i_vet]);
i aux = 0; // prepara para reiniciar o preenchimento_aux 0; // prepara para re n c ar o preench mento
i_vet++; // posiciona no próximo elemento do vetor 
break;
case EOF : break; case EOF : break; 
default: str_aux[i_aux] = buf_txt[i_t]);
i_aux++;
}}
i_aux = 0; // prepara para reiniciar o preenchimento
printf("\n"); 
Slide 21
p f( \ );
} 
.......
int main( )nt ma n( )
{
int ptos[50], i_p=0; // vetor de pontuação e índice
if ((p out = fopen("textoout txt" "r"))!= NULL)if ((p_out = fopen( textoout.txt , r ))!= NULL)
{
ConvertePontuacao(p_out, ptos);
printf("\n\nVetor resultante da conversao:"); printf( \n\nVetor resultante da conversao: ); 
while (ptos[i_p] != -1)
{
i tf(" %d " t [i ])printf(" %d ",ptos[i_p]);
i_p++;
}
fclose (p_out);
} 
else 
printf ("\nNao encontrou o arquivo!\n") ;
return 0;
} 
Slide 22
} 
Slide 23
Extração de elementos de linhas de um Extração de elementos de linhas de um 
arquivo textoarquivo texto
As informações armazenadas em um arquivo texto (portanto 
em representação caractere), separados entre si por 
delimitadores (tipicamente caracteres diferentes do espaço delimitadores (tipicamente caracteres diferentes do espaço, 
como vírgula, # ou /), podem ser extraídas e convertidas, se 
forem números, para a representação binária de inteiros ou 
ireais.
Exemplos de possíveis conteúdos de arquivos texto:
Exemplo1 (3 linhas):
2,Maria da Silva,8.4,5.7,8.8,
Exemplos de possíveis conteúdos de arquivos texto:
5,José Ferreira,9.0,5.8,7.5,
14,Agnes Lindemann,8.5,7.0,6,
Exemplo2 (3 linhas):
20#Ricardo Leão#8.4#5.7#8.8#
55#João Pedreira#9 0#5 8#7 5#
Slide 24
55#João Pedreira#9.0#5.8#7.5#
67#Dagmar Scherer#8.5#7.0#6.0#
Extração de elementos variados Extração de elementos variados 
de linhas de arquivo texto de linhas de arquivo texto 
Passos:
1 L t d li h d i t i (f ã 1. Ler toda a linha do arquivo como uma string (função 
fgets).
2 Ext i d st in lid s bst in s sp nd m 2. Extrair da string lida substrings que correspondam 
aos dados (função strtok).
3 Converter cada substring para o tipo de dado 3. Converter cada substring para o tipo de dado 
correspondente (funções atoi e atof).
Exemplo Exemplo 33
Desenvolverum programa em C que leia um arquivo texto
contendo nomes e notas, listando os conteúdos formatados e
calculando a média das notas lidascalculando a média das notas lidas.
O programa ao executar lê o arquivo dados,
produzindo a saída:
Slide 26
#include<stdio.h>
# l d dl b h#include<stdlib.h>
#include<string.h> // necessário para strtok( )
#define MAX 80
FILE *arq; FILE *arq; 
char opcao_menu( ) // menu com as operações
{ system("CLS");
printf("(L)istar notas\n");printf( (L)istar notas\n );
printf("(F)im \n");
printf(">");
return((getchar()));((g ()))
}
void listar_notas( );
int main()
{ 
// próximo slide
int main()
{ { 
char op;
op = opcao_menu( ); // função retorna a opção (char)
f ( ' ') if (op =='L') 
{
if (arq = fopen("dados.txt","r") == NULL) //abrir só para leitura( q p ( ) ) p
printf("Erro ao abrir arquivo \n");
else
{{
listar_notas( ); // chama listagem de notas
fclose(arq);
}}
}
printf("\nPrograma sera encerrado!\n”);
return 0;return 0;
} 
void listar_notas( )
{ int num, notas;
float n1,n2,media;
h [21]char nome[21];
char buf[MAX];
// imprime cabeçalho
printf("\n");printf( \n );
printf("NUM | NOME | N! | N2 \n");
printf("-----+--------------------------+-------+----------\n");
notas=0; 
di 0media=0;
fgets(buf,MAX,arq); // lê string de até Max caracteres em buf
while (!feof(arq)) // enquanto não for fim de arquivo.......
{ { 
num= atoi(strtok(buf,",")); // transforma string de buf em int
strcpy(nome, strtok(NULL,",")); 
n1=atof( strtok(NULL,",")); // transforma string de buf em float 
2 f( k(NULL " ")) n2=atof( strtok(NULL,",")); 
printf("%03d | %20s | %4.1f | %4.1f |\n",num, nome,n1,n2);
notas = notas + 2; 
media =media + n1 + n2;media =media + n1 + n2;
fgets(buf,MAX,arq); // lê próxima linha
}
printf("-----+----------------------------+-------+---------\n");
d d /
p
media=media/notas;
printf("Media das notas = %4.1f\n", media);
}
ExecuçãoExecução:çç
ExemploExemplo 44
Desenvolver um programa em C que:
1. crie um arquivo binário, através de uma função, contendo as. um qu , um fu ç ,
seguintes informações de produtos de uma quitanda:
nome (string)
valor (float)valor (float)
comentário (string)
2. a seguir, baseado no conteúdo do arquivo acima e através de
uma função gere um arquivo texto onde cada linha apresentauma função, gere um arquivo texto onde cada linha apresenta
o número de ordem sequencial do produto correspondente no
arquivo binário, seguido do contéudo do campo <nome>, hífen
e conteúdo do campo <comentário>e conteúdo do campo <comentário>.
3. antes de encerrar, novamente através de função, imprima o
arquivo texto gerado.
31
A execução do programa deve gerar o conteúdo da tela abaixo:
32
/* Gera um arquivo binário, com estruturas com informações de produtos de 
uma quitanda: nome do produto (string)
valor (float)
Exemplo 1
valor (float)
comentario (string)
Gera um arquivo texto em que cada linha inicia pelo número correspondente à 
seqüência do produto no arquivo, seguido do conteúdo do campo nome do 
d híf úd d á i */produto, hífen, e conteúdo do campo comentário. */
#include <stdio.h>
#include <stdlib.h>
#include <string h>#include <string.h>
#define MAXNOME 31
#define MAXCOMENT 51
FILE *arqbin;FILE arqbin;
FILE *arqtxt;
struct prod
{ 
h [MAXNOME]char nome[MAXNOME];
float valor;
char coment[MAXCOMENT];
}}
int gravarqbin (FILE *, struct prod); //protótipos
int gerarqtexto (FILE *, FILE *, struct prod);
void listarqtexto(FILE *);
Slide 33
void listarqtexto(FILE );
...
int gravarqbin (FILE *, struct prod); //protótipos
int gerarqtexto (FILE *, FILE *, struct prod);
id li t t t (FILE *)
Exemplo 1
void listarqtexto(FILE *);
void le_texto (char texto[ ], int size_texto) // string: ponteiro implícito
{
char dummy[size texto + 1]; // com um caractere a mais do que o textochar dummy[size_texto + 1]; // com um caractere a mais do que o texto
fflush(stdin);
fgets(dummy, sizeof(dummy), stdin); // lê caracteres 
// O último caractere tem que ser '\n' para estar correto:// O último caractere tem que ser \n para estar correto
while(dummy[strlen(dummy) -1] != '\n')
{
printf("\n Numero de caracteres digitados maior que previsto. " );
i f(“\ N i i h %d " i 1)printf(“\n Numero maximo aceito eh %d.", size_texto - 1);
printf(“\n Digite o conteudo novamente.\n"); 
fflush(stdin);
fgets(dummy sizeof(dummy) stdin); // lê caracteres novamentefgets(dummy, sizeof(dummy), stdin); // lê caracteres novamente
}
dummy[strlen(dummy) - 1]= '\0'; // sempre precisa substituir o '\n'
strcpy(texto dummy); // transfere conteúdo digitado sem o '\n‘strcpy(texto, dummy); // transfere conteúdo digitado sem o \n
}
Slide 34
...
int main ( )
{
Gravação do 
arquivo binário{
int cont_reg; // retornado pela função, informa nro de registros gravados
struct prod produto; // var buffer globalp p g
if ((arqbin = fopen("c:\\prod.bin" , "wb")) == NULL)
printf("\nErro abertura arquivo binario - criacao\n\n");
else
{{
cont_reg = gravarqbin (arqbin, produto);
printf("\nProdutos gravados = %d\n\n", cont_reg) ;
fclose(arqbin);fclose(arqbin);
if (cont_reg < 1)
printf(“\nArquivo binário está vazio! ");
else
if ((arqbin = fopen("c:\\prod.bin" , "rb")) == NULL)
printf("\nErro abertura arquivo binario - leitura\n\n");
else
if (( t t f (" \\ d t t" " ")) NULL)if ((arqtxt = fopen("c:\\prod.txt" , "w")) == NULL)
printf("\nErro abertura arquivo texto - criacao\n\n");
else 
{
Slide 35
{
// próximo slide
... 
l
Gravação do 
arquivo textoelse
{ 
printf("\nLinhas escritas no arquivo texto = %d\n\n", 
gerarqtexto (arqbin arqtxt produto);
arquivo texto
gerarqtexto (arqbin, arqtxt, produto);
fclose(arqtxt);
fclose(arqbin);
if ((arqtxt = fopen("c:\\prod txt" "r")) == NULL)if ((arqtxt fopen( c:\\prod.txt , r )) NULL)
printf("\nErro abertura arquivo texto - leitura\n\n");
else
{ 
Listagem do 
arquivo texto
listarqtexto(arqtxt);
printf("\nPrograma concluído com sucesso!\n\n”); 
fclose(arqtxt);
}}
} 
}
return 0;return 0;
}
// funções nos próximos slides
Slide 36
// criação do arquivo binário, retornando número de registros gravados:
int gravarqbin (FILE * arqb struct prod produt)int gravarqbin (FILE arqb, struct prod produt)
{
int contgrav = 0, op;
do
{
// leitura dos campos, com consistência
printf("\nNome do produto com ate %d caracteres: ", MAXNOME); 
le texto(produt nome sizeof product nome); // lê e exclui \nle_texto(produt.nome,sizeof product.nome); // lê e exclui \n
do
{ 
printf("\nValor do produto: "); 
%
Gravação no 
arquivo p ( p )
scanf("%f", &produt.valor);
} while (produt.valor <= 0);
printf("\nComentario com ate %d caracteres: ", MAXCOMENT); 
le texto(produt coment sizeof produt coment); 
arquivo 
binário
le_texto(produt.coment, sizeof produt.coment); 
fwrite(&produt, sizeof(prod), 1, arqb);
contgrav++; // conta registros gravados
printf("\n1 - NovoProduto; 0 - EncerrarInclusao\n");
f("%d" )
p ( )
scanf("%d", &op);
} while (op);
return contgrav; // retorna número de registros gravados
} 
Slide 37
} 
...
// conversão para arquivo texto
int gerarqtexto (FILE * arqbin FILE *arqt struct prod produt)int gerarqtexto (FILE arqbin, FILE arqt, struct prod produt)
{
int cont = 1;
while (!(feof(arqbin)))
Gravação em 
arquivo texto 
 f i tf
( ( ( q )))
if (fread(&produt, sizeof(prod), 1, arqbin) == 1)
{
// imprime txt, inserindo caracteres adicionais no fprintf:
f i tf( t " d t %d % % \ " t d t 
com fprintf
fprintf(arqt, "produto %d : %s - %s\n", cont, produt.nome, 
produt.coment);
cont++;} } 
return cont-1; // retorna número de linhas gravadas
}
void listarqtexto(FILE *arqt) // impressão caractere à caractereq ( q ) mp
{
char caract;
while (!feof(arqt))
i tf ("% " t ( t))printf ("%c", getc(arqt));
} 
Slide 38

Outros materiais