Professional Documents
Culture Documents
Contedo
Introduo
Dificuldade de atualizao em arquivos texto
Vantagens com arquivo binrio
Abrindo
Modo de abertura de arquivo binrio
Escrevendo/Lendo
Posicionando em arquivo binrio
Fechando
Introduo
Fim de
arquivo EOF
Introduo
unsigned int conta;
char nome[ 30 ];
double saldo;
100
200
400
struct Conta {
unsigned int conta // bytes?
char nome[ 30 ]
// bytes?
double saldo;
// bytes?
}
Sempre o mesmo tamanho!!!
O valor de retorno da funo 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/criao do arquivo, a funo retornar o valor NULL. O erro geralmente
acontece por duas razes:
O arquivo no existe, caso tenha sido requisitado para leitura.
O usurio atual no tem permisso para abrir o arquivo com o modo de acesso pedido. Por exemplo, o
arquivo somente-leitura, ou est bloqueado para gravao por outro programa, ou pertence a outro
usurio e no tem permisso para ser lido por outros.
Significado
Abre o arquivo somente para leitura. O arquivo deve existir. (O r vem do ingls read, ler)
r+
Abre o arquivo somente para escrita no incio do arquivo. Apagar o contedo do arquivo se ele j
existir, criar um arquivo novo se no existir. (O w vem do ingls write, escrever)
w+
Abre o arquivo para escrita no final do arquivo. No apaga o contedo pr-existente. (O a vem do
ingls append, adicionar, apender)
a+
fwrite (&VARIVEL,TAMANHO,QUANTIDADE,ARQUIVO);
- Escreve no arquivo a varivel.
- Recebe quatro argumentos: o endereo da varivel, o tamanho em byte da varivel, a quantidade de registros e o
ponteiro para a estrutura FILE do arquivo.
- Retorna o nmero de itens escritos.
struct clienteConta {
unsigned int contaNum;
char nome[ 25 ];
double saldo;
};
struct clienteConta vazioCliente;
fread(&codigo,sizeof(codigo),1, fptr);
fread( &cliente, sizeof( struct clienteConta ), 1, cfPtr );
100
200
300
400
struct ClienteConta {
int numConta;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
// numero da conta
// nome
// saldo
9.
10.
11.
struct ClienteConta clienteVazio = { 0, "", 0.0 }; // // cria ClienteConta com informao default
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
if ( (cArquivoPtr = fopen( "contas.dat", "wb" ) ) == NULL ) //abre arquivo para escrita se existe descarta contedo
puts( "Arquvio nao pode ser aberto." );
else {
22.
1.
2.
3.
4.
5.
struct ClienteConta {
int numConta;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
// numero da conta
// nome
// saldo
FILE *cArquivoPtr;
struct ClienteConta cliente;
int numeroConta;
if ( (cArquivoPtr = fopen( "contas.dat", r+b" ) ) == NULL ) // abre arquivo para escrita se existe descarta contedo
puts( "Arquvio nao pode ser aberto." );
else {
printf( "%s", "Entre numero da conta ( 1 a 100):\n? " );
scanf( "%d", &numeroConta );
fflush(stdin);
//limpa o buffer de entrada do carater enter
fseek( cArquivoPtr, ( numeroConta - 1 ) * sizeof( struct ClienteConta ), SEEK_SET );
fread( & cliente, sizeof( struct ClienteConta ), 1, cArquivoPtr );
if ( cliente.numConta != 0 )
printf("A conta de numero: %d ja existe", numeroConta );
else{
printf( "%s", "Entre nome:\n? " );
gets(cliente.nome);
printf( "%s", "\nEntre com o saldo:\n? " );
scanf("%lf",&cliente.saldo);
cliente.numConta = numeroConta;
fseek( cArquivoPtr, ( cliente.numConta - 1 ) * sizeof( struct ClienteConta ), SEEK_SET ); // seta posicao para registro especifico
fwrite( &cliente, sizeof( struct ClienteConta ), 1, cArquivoPtr );
}
fclose( cArquivoPtr );
} // fim else
} // fim main
1.
2.
3.
4.
5.
struct clienteConta {
int contaNum;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
9.
10.
11.
12.
13.
14.
// numero da conta
// nome
// saldo
Este programa
seria qual
consulta em SQL?
FILE *cArquivoPtr;
struct ClienteConta cliente;
if ( (cArquivoPtr = fopen( "contas.dat", "rb" ) ) == NULL ) {
puts( "Arquivo nao pode ser aberto." );
}
else {
printf( "%-6s%-27s%10s\n", "Conta", "Nome", "Saldo" );
//cabecalho
15.
16.
17.
18.
19.
20.
if ( cliente.numConta != 0 )
printf( "%-6d%-27s%10.2f\n", cliente.numConta, cliente.nome, cliente.saldo );
21.
22.
23.
}
fclose( cArquivoPtr ); // fclose fecha arquivo
} // fim else
} // fim main
1.
2.
3.
4.
5.
struct clienteConta {
int contaNum;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// numero da conta
// nome
// saldo
//cabecalho
20.
21.
22.
23.
if ( cliente.numConta != 0 )
fprintf(escritaPtr, "%-6d%-27s%10.2f\n", cliente.numConta, cliente.nome, cliente.saldo );
24.
25.
26.
27.
28.
}
fclose( cArquivoPtr ); // fclose fecha arquivo
} // fim else
return 0;
} // fim main
1.
2.
3.
4.
5.
struct clienteConta {
int numConta;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
9.
10.
Removendo estrutura do
Arquivo randomicamente
// numero da conta
// nome
// saldo
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
if ( cliente.numConta == 0 )
printf("A conta de numero: %d esta VAZIA", numeroConta );
else{
printf("Dados da conta a ser removida \n");
printf( "%-6d%-27s%10.2f\n", cliente.numConta, cliente.nome, cliente.saldo );
26.
27.
28.
29.
30.
31.
32.
printf( "%s", "Entre numero da conta para ser removida ( 1 a 100):\n? " );
scanf( "%d", &numeroConta );
fseek( cArquivoPtr, ( numeroConta - 1 ) * sizeof( struct ClienteConta ), SEEK_SET );
fread( &cliente, sizeof( struct ClienteConta ), 1, cArquivoPtr );
1.
2.
3.
4.
5.
struct clienteConta {
int numConta;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
9.
10.
11.
// numero da conta
// nome
// saldo
FILE *cArquivoPtr;
// leitura
struct ClienteConta cliente;
int numConta;
double transacao;
//valor do saque ou deposito
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
if ( cliente.numConta == 0 )
printf("A conta de numero: %d esta VAZIA", numConta );
else{
printf( "%-6d%-27s%10.2f\n", cliente.numConta, cliente.nome, cliente.saldo );
printf( "%s", "Entre deposito ( + ) or saque ( - ): " );
scanf( "%lf", &transacao );
cliente.saldo += transacao; // atualiza saldo do registro
29.
30.
31.
32.
33.
printf( "%s", "Entre numero da conta para ser removida ( 1 a 100):\n? " );
scanf( "%d", &numeroConta );
fseek( cArquivoPtr, ( numeroConta - 1 ) * sizeof( struct ClienteConta ), SEEK_SET );
fread( &cliente, sizeof( struct ClienteConta ), 1, cArquivoPtr );
1.
2.
3.
4.
5.
struct clienteConta {
int numConta;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
9.
10.
11.
// numero da conta
// nome
// saldo
FILE *cArquivoPtr;
// leitura
struct ClienteConta cliente;
int numConta;
char nome[]45];
//valor do saque ou deposito
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
if ( cliente.numConta == 0 )
printf("A conta de numero: %d esta VAZIA", numConta );
else{
printf( "%-6d%-27s%10.2f\n", cliente.numConta, cliente.nome, cliente.saldo );
printf( "%s", "Entre nome: " );
gets( nome );
35.
36.
37.
printf( "%s", "Entre numero da conta para ser removida ( 1 a 100):\n? " );
scanf( "%d", &numeroConta );
fflush(stdin);
fseek( cArquivoPtr, ( numeroConta - 1 ) * sizeof( struct ClienteConta ), SEEK_SET );
fread( &cliente, sizeof( struct ClienteConta ), 1, cArquivoPtr );
strcpy(cliente.nome, nome);
Referncias
Video Aulas (YouTube)
Programar em C - Manipulao de Arquivos txt em C / Ler Dados https://www.youtube.com/watch?v=y_euDUgoND8
Programar em C - Manipulao de Arquivos txt em C / Incluir Dados - Aula 84
https://www.youtube.com/watch?annotation_id=annotation_238568&feature=iv&src_vid=y_euDU
goND8&v=USsUSMpNGsM
Sites sobre manipulao de Arquivos em C
http://homepages.dcc.ufmg.br/~joaoreis/Site%20de%20tutoriais/c_int/arquivos.htm
http://pt.wikibooks.org/wiki/Programar_em_C/Entrada_e_sa%C3%ADda_em_arquivos
http://www.vivaolinux.com.br/artigo/Manipulando-arquivos-em-C-%28parte-1%29/?pagina=4
http://homepages.dcc.ufmg.br/~joaoreis/Site%20de%20tutoriais/c_int/arquivos.htm
http://pt.wikibooks.org/wiki/Programar_em_C/Entrada_e_sa%C3%ADda_em_arquivos
http://www.ime.usp.br/~elo/IntroducaoComputacao/Manipulacao%20de%20arquivo.htm
Outros.. curiosidades
Streams padro
Quando um programa em linguagem C iniciado so abertas trs streams: stdin, stdout e stderr.
stdin define a entrada padro do sistema, normalmente o teclado.
stdout define a sada padro do sistema, normalmente o monitor.
stderr define a sada padro dos erros, normalmente tambm o monitor.
Estas streams so ponteiros de arquivos e podem ser redirecionadas. Assim, nas funes que voc utiliza
ponteiros de arquivos para entrada e sada de dados voc pode muito bem usar estas streams de modo ao seu
programa receber dados do teclado e escrever no monitor. Isto foi mostrado no exemplo da seo anterior na
linha;
fscanf(stdin,"%s",string); /* l string do teclado */
onde o programa leu a varivel string do teclado atravs da streams padro stdin.
Porm esteja consciente que estas streams no so variveis e no podem receber um valor. Ou seja, voc
no pode abr-las com fopen.
Quando o programa encerrado estas streams so fechadas automaticamente, do mesmo jeito que foram
criadas, voc no deve nunca tentar abr-las ou fech-las.
1.
2.
3.
4.
5.
struct ClienteConta {
int numConta;
char nome[ 45 ];
double saldo;
};
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
// numero da conta
// nome
// saldo
FILE *cArquivoPtr;
struct ClienteConta cliente;
if ( (cArquivoPtr = fopen( "contas.dat", r+b" ) ) == NULL ) // abre arquivo para escrita se existe descarta contedo
puts( "Arquvio nao pode ser aberto." );
else {
printf( "%s", "Entre numero da conta ( 1 a 100, 0 para finalizar )\n? " );
scanf( "%d", &cliente.numConta );
fflush(stdin);
//limpa o buffer de entrada do carater enter
while ( cliente.contaNum != 0 ) {
printf( "%s", "Entre nome:\n? " );
gets(cliente.nome);
printf( "%s", "\nEntre com o saldo:\n? " );
scanf("%lf",&cliente.saldo);
fseek( cArquivoPtr, ( cliente.numConta - 1 ) * sizeof( struct ClienteConta ), SEEK_SET ); // seta posicao para registro especifico
25.
26.
27.
28.
29.
30.
31.
32.
}
fclose( cArquivoPtr );
} // fim else
} // fim main