Buscar

Aula26 ArquivoTxt emC

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 25 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 25 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 25 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

ArquivoArquivoArquivoArquivo
Conjunto de DADOS armazenados em memória 
secundáriasecundária
Binário
( d )Arquivos em C (estruturado)
T t[tratados como streams] Texto
(caracteres)
[tratados como streams]
1
Arquivo Texto Arquivo Texto vsvs BinárioBinário
ARQUIVO TEXTO
• dados: caracteres (1 byte (8 bits) cada)( y ( ) )
• organizado em linhas, de tamanho variável
ARQUIVO BINÁRIOARQUIVO BINÁRIO
• dados: estruturados e dados simples 
(cada elemento pode conter mais de 1 byte)
i d bl b t• organizado em blocos, em bytes...
COMPARAÇÃO:COMPARAÇÃO
pegando-se um número inteiro (de 32 bits), com 88 dígitos...
No arquivo texto terá:
sizeof(char)*88 = 64 bitssizeof(char) 88 = 64 bits
No arquivo binário terá:
sizeof(int) = 32 bits { do mesmo jeito que
está na memória! }
2
está na memória! }
Arquivos: comparação texto e binárioArquivos: comparação texto e binário
Texto:
Facilidade para a criação 
Binário:
O processamento é mais rápido - Facilidade para a criação, 
visualização de conteúdo e de 
edição de arquivos texto, com 
qualquer editor de textos
- O processamento é mais rápido, 
pois os dados não precisam de 
qualquer conversão.
qualquer editor de textos.
- O processamento é lento porque 
os dados, ao serem gravados, 
devem ser convertidos para a 
- Consomem menos espaço em 
bytes, o que os tornam mais 
adequados para grandes volumes 
devem ser convertidos para a 
representação de caracteres em 
ASCII.
C b i á 
da dados.
- Conteúdo não pode ser 
entendido sem a “máscara” - Consomem bem mais área para 
armazenamento
- Caracteres numéricos precisam 
entendido sem a máscara 
correspondente (como a 
structure utilizada).
S d lid l ser convertidos para permitir 
operações
- So podem ser lidos pelo 
programa que o criou. 
Arquivo TextoArquivo Texto
• elemento/posição corrente:
- linha
caractere- caractere
• marcador de final de linha:
- uso pela linguagem C: “\n”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 DOS OS/2 Microsoft Windows: CR+LF- 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⌫⌫
⌫⌫
⌫⌫
ESTE EH UM TEXTO EXEMPLO EBLABLABLA
4
⌫⌫⌫⌫
EOF FINAL DE LINHA
Arquivo Texto: marca de fim de linhaArquivo Texto: marca de fim de linha
As marcas de fim de linha tem que ser colocadas explicitamente pelo 
programa.
A marca de fim de arquivo é gerada pelo sistema quando o arquivoA marca de fim de arquivo é gerada pelo sistema, quando o arquivo
que foi aberto com opção de escrita é fechado (embora possa ser 
inserida pelo programa).
A marca de final de linha em Linguagem C é o caractere ‘\n’, mas 
conforme o sistema operacional sua representação pode mudar:
- 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 DOS OS/2 Microsoft Windows: em DOS, OS/2, Microsoft Windows:
CR+LF
Ou seja cada sistema operacional converte o \nOu seja, cada sistema operacional converte o \n
para o seu marcador específico de fim de linha!
Leitura e/ou gravação de arquivos texto:Leitura e/ou gravação de arquivos texto:
A leitura ou gravação em um arquivo texto pode ser feita:
Leitura e/ou gravação de arquivos texto:Leitura e/ou gravação de arquivos texto:
A leitura ou gravação em um arquivo texto pode ser feita:
- linha a linha ou
- caractere a caracterecaractere a caractere. 
Uma linha em um arquivo texto é o conjunto dos caracteresUma linha em um arquivo texto é o conjunto dos caracteres 
que se encontram no arquivo entre:
- o início do arquivo e a primeira marca de fim de linha, ouo início do arquivo e a primeira marca de fim de linha, ou 
o início do arquivo e a marca de fim de arquivo (no caso 
de arquivos com uma só linha) ou 
- duas marcas de fim 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 da estrutura */
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.”);
} 
7
Modos de abertura para arquivos textoModos de abertura para arquivos texto
Modo de 
abertura Arquivo Existe
Arquivo 
não existe
Permissão 
de leitura
Permissão
de escrita
r ok erro x
cria novo, antigo 
iw eliminado cria x
r+ ok erro x x
cria novo antigo
w+
cria novo, antigo 
eliminado cria x x
novos dados 
a
acrescentados ao 
final cria x
novos dados 
a+
acrescentados ao 
final cria x x
Abertura de arquivo texto Abertura de arquivo texto 
#include <stdio h> /* contém definições e funções 
Exemplo:Exemplo: Retorna um apontador para uma estrutura FILE.
#include <stdio.h> / contém definições e funções 
p/ uso e manipulação de streams */
#include <stdlib.h>
FILE *arq;
int main( )
{{
arq = fopen(“c:\\exemplo.txt”,”r”); /*abertura para leitura */
if (arq == NULL) /* retorno NULL indica erro na abertura */
printf(“Erro na abertura do arquivo.”);
.....
} 9}
Internamente ao programa, nomes de arquivos que 
incluam \ devem ser escritos com duas \\
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
10
fgets (<&strbuffer>,<tamanho>,<FILE*>)
Lê i /li h d iLê uma string/linha de um arquivo
Obs.: a função inclui um “\0” ao fim da string, 
logo a função lê até tamanho-1 ou até um caractere logo a função lê até tamanho-1 ou até um caractere 
de nova linha (\n) ser lido, adicionando-o à string.
fputs (<&strbuffer>,<FILE*>)fputs (<&strbuffer>,<FILE >)
Escreve uma string/linha num arquivo
fprintf (<FILE *>,<“txtE%cods”>,<var1,var2,...>)
Escreve caracteres em um arquivoEscreve caracteres em um arquivo
*similar a printf()
fscanf (<FILE *> <“%cods”> <&var1 &var2 >)fscanf (<FILE *>,< %cods >,<&var1,&var2,...>)
Lê caracteres de um arquivo
* i il f()
11
*similar a scanf()
ExemploExemplo fgets() e fputs()fgets() e fputs()pp g () p ()g () p ()
#include <stdio.h>
/*Este programa faz uma cópia do conteúdo do 1º para o 2º arquivo/ Este programa faz uma cópia do conteúdo do 1 para o 2 arquivo, 
os quais são passados como parâmentro*/
int main(int argc, char **argv) //arqv é um vetor com nomes dos arquivos
{{
FILE *entrada, *saida;
char string[256];
if ((entrada = fopen(argv[1], "r")) == NULL)
printf("Erro ao abrir %s\n", argv[1]);
Mostrar exemplo de 
parâmetros por linha 
d d d d
p (\ , g [ ]);
else if ((saida=fopen(argv[2], "w")) == NULL)
{
printf("Erro ao abrir %s\n", argv[2]);
fclose(entrada);
de comando rodando. 
}
else 
{
while (fgets(string, sizeof(string), entrada))
//*copia uma linha ou 255 (256-1) caracteres e fecha
“string” com o caractere nulo (“\0”)*/
fputs(string, saida); /*escreve no arq. de saída*/
fclose(entrada);
f l ( id )fclose(saida);
}
} 12
ExemploExemplo fprintf()fprintf()ExemploExemplo fprintf()fprintf()
...
/*Cadastra clientes e seus telefones em um arquivo texto./ Cadastra clientes e seus telefones em um arquivo texto.
Obtém os dados pelo teclado*/
...
FILE *arq;
char nome[80];char nome[80];
int prefixo, num;
arq = fopen(“arquivo.txt”,“a”);
...
scanf (“%s%d%d”, nome, &prefixo, &num);
/*lê dados do teclado...*/
fprintf (arq, “%s %d %d”, nome, prefixo, num);fprintf (arq, %s %d %d , nome, prefixo, num);
/*...os escreve no arquivo*/
...
...
13
Exemplo fscanf()Exemplo fscanf()Exemplo fscanf()Exemplo fscanf()
...
/*Consulta clientes de acordo com a estrutura do arquivo/ Consulta clientes de acordo com a estrutura do arquivo 
texto do exemplo anterior*/
...
FILE *arq;
char nome[80] nome2[80];char nome[80], nome2[80];
int prefixo, num;
arq = fopen(“arquivo.txt”,“r”);
...
printf (“Nome? ”);
gets (nome);
while (!feof(fp)){while (!feof(fp)){
fscanf (arq, “%s%d%d”, nome2, &prefixo, &num);
if (!strcmp(nome, nome2)){
...
}}
}
...
...
14
Funções sobre arquivosFunções sobre arquivos
feof (<FILE *>)
Indica se um arquivo chegou ao fimq g
Retorna verdadeiro (não-zero) caso o final foi atingido, falso 
(zero) caso contrário.
ferror(<FILE *>)
Indica se a última operação com um arquivo produziu um erroIndica se a última operação com um arquivo produziu um erro
Cada nova operação com o arquivo modifica a condição de 
erro.
...
FILE *arq;
...
...
FILE *arq;
char c;
while(!feof(arq)){ /* Enquanto
não for o fim faça... */
...
}
;
arq = fopen(...,“r”);
...
c = getc(arq);
if(ferror(arq))
15
}
...
...
if(ferror(arq))
printf(“Erro na Leitura!”);
...
...
rewind(<FILE *>)rewind(<FILE >)
Seta a posição corrente do arquivo para o início
fseek(<FILE *>,<numbytesdesloc>,<origem>)
Move a posição corrente de leitura/escrita para a posição 
calculada como origem+numbytesdesloc
Os valores possíveis definidos para origem são:Os valores possíveis, definidos, para origem são:
SEEK_SET ou 0 = Início do arquivo
SEEK_CUR ou 1 = Ponto corrente no arquivo
SEEK END ou 2 = Fim do arquivoSEEK_END ou 2 = Fim do arquivo
...
FILE *arq;
struct Estrutura buffer;
...
FILE *arq;
arq = fopen( ); arq = fopen(...);
fseek(arq,1*sizeof(char),SEEK_SET);
/*seta a posição para o início do 2º 
caractere do arquivo*/ 
h t ( )
arq = fopen(...);
...
rewind(arq); 
/*posição corrente = início*/
16
char c = getc(arq);
...
...
...
...
rename(<NomeAntigo>,<NovoNome>)
Renomeia um arquivo ou o Move para um diretório destinoq p
Obs.: o arquivo deve estar fechado!
remove(<NomeDoArquivo>)
Apaga o arquivo especificado do discoApaga o arquivo especificado do disco
Obs.: o arquivo deve estar fechado!
...
...
remove(“tourstart.exe”);
...
...
rename(“a.dat”,“b.dat”); ( );
/*remove o arquivo especificado*/ 
...
...
( , );
/* a.dat -> b.dat */
...
...
17
Exercícios com arquivos textoExercícios com arquivos texto
1. Considerar um arquivo texto já existente. Faça um
procedimento que copie este para outro conservando oprocedimento que copie este para outro, conservando o
mesmo conteúdo do primeiro
2. Faça outro para incluir uma nova linha no final de um 
arquivo
3. Faça agora um para substituir um caractere por outro
(parâmetros: nome do arquivo caractere que será(parâmetros: nome do arquivo, caractere que será
substituído e caractere substituto)
18
1. Copia do conteúdo de um arquivo para outro
/*Gera uma copia de um arquivo texto*/
#include <stdio h>#include <stdio.h>
#include <stdlib.h>
#define MAXLINHA 255
int main( )
{{
FILE *arq1; 
FILE *arq2;
int cont = 0;
char linha[MAXLINHA];char linha[MAXLINHA];
system("color F1");
if ((arq1 = fopen("texto_input.txt", "r")) == NULL)
printf("Erro ao abrir arquivo entrada \n");
else
if ((arq2 = fopen("texto_output.txt", "w")) == NULL)
printf("Erro ao abrir arquivo saida \n");
else
{
while (!feof(arq1))
if (fgets(linha, sizeof(linha), arq1) != NULL )
{ // leu linha
cont++ ; 
f t (li h 2) // li hfputs (linha, arq2); // grava linha
}
printf("\nLinhas gravadas: %d\n", cont);// informa nro de linhas gravadas
fclose (arq1);
f l s ( 2);
19
fclose(arq2);
}
.....
} 
2. Inserir nova linha no fim de um arquivo
#include <stdio.h>#
int insereLinhaFinal(){
FILE *arq;q;
char nome[30];
printf(“Nome do arquivo: ”);
scanf(“%s”,nome);
if ((arq = fopen(nome, "a")) == NULL){
/*abre para acrescentar*/
printf("Erro ao abrir %s\n", nome);
exit(1);
}
( \ ) / /putc(‘\n’,arq); /*acrescenta nova linha*/
fclose(arq);
}
20
3. Substituiu um caractere por outro
#include <stdio.h>#
int main(int argc, char **argv){
/*Lembrando.. argv é um ponteiro pra ponteiro!*/
/* uso: programa.exe <arquivotexto> <caractere> <substituto> *// uso: programa.exe <arquivotexto> <caractere> <substituto> /
FILE *arq;
char lugar;
if ((arq = fopen(argv[1] "r+")) == NULL){if ((arq = fopen(argv[1], r+ )) == NULL){
/*abre para acrescentar*/
printf("Erro ao abrir %s\n", argv[1]);
exit(1);
}}
lugar = *(argv[2]); /*caractere que será substituído*/
printf("\n%c\n",*(argv[2]));
printf("\n%c\n",lugar);
while (!feof(arq)){while (!feof(arq)){
char temp = getc(arq);
if(temp == lugar){
fseek(arq,-1*sizeof(char),SEEK_CUR); /*volta a 
i ã d t d */posição do caractere procurado*/
putc(*(argv[3]),arq); /*substitui*/
fflush(arq); /*escreve mudanças*/
}
}
21
}
fclose(arq);
}
ExercíciosExercícios
A partir de um arquivo binário, já gravado, com estruturas quep q , j g , q
contém informações sobre atletas (ver aulas anteriores):
Nome (string)
Id d (i t)Idade (int)
Altura (float)
1 Gerar um arquivo texto onde cada linha apresenta o número1. Gerar um arquivo texto onde cada linha apresenta o número
de ordem sequencial do atleta correspondente a cada
estrutura, seguido do contéudo dos campos com pontuação, g p p ç
conforme o exemplo:
Atleta 1: João Silva – 25 anos – 1.87m
22
ExercíciosExercícios
2. Outro programa que:
- remove um atleta dos 2 arquivos
inclui mais um atleta no final do arquivo binário e texto- inclui mais um atleta no final do arquivo binário e texto
- altera algum campo do arquivo binário e atualiza o arquivo
texto correspondente.p .
23
fclose (<apontador para FILE>)
fopen (<nome do arquivo>,<modo de abertura>)
“r” – abre um arquivo texto para leiturafclose (<apontador para FILE>)
fflush (<apontador para FILE>)
“w” – cria/recria um arquivo texto para escrita
“a” – acrescenta ao fim de um arquivo texto
existente
“r+” – abre um arquivo texto para leitura/escrita
putc (<caractere>,<FILE *>)
getc (<FILE *>)
“w+” – cria/recria um arquivo texto para
leitura/escrita
“a+” – acrescenta em/cria um arquivo texto
para leitura/escrita
fgets (<&strbuffer>,<tamanho>,<FILE*>)
fputs (<&strbuffer>,<FILE*>)fputs (<&strbuffer>,<FILE >)
fprintf (<FILE *>,<“txtE%cods”>,<var1,var2,...>)
f f ( d 1 2 )fscanf (<FILE *>,<“%cods”>,<&var1,&var2,...>)
rename(<NomeAntigo>,<NovoNome>)
remove(<NomeDoArquivo>)
24
ExercíciosExercícios
3 Faça uma função que :3. Faça uma função que :
- receba um nome de arquivo e uma matriz de char 80x25
- leia o arquivo atribuindo um caractere a cada posição daq p ç
matriz, mantendo a topologia do texto original
- caso o arquivo não ocupe a matriz toda, as posições vazias
d ã b 0 ( t ‘\0’)deverão receber0 (caractere ‘\0’)
este programa B
e s t e p r o g r ama B 0
t em uma ma t r i z B 0tem uma matrizB
linha 3 B
ultima linha B
t em uma ma t r i z B 0
l i n h a 3 B 0
u l t i m a l i n h a B 0
B 0
...
4 F t f ã
B
BBBBBBBBBBBBBBB
B 0
B B B B B B B B B B B B B B B 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4. Faça uma outra função que:
– receba a matriz do exercício anterior
– limpe a tela e exiba a matriz trocando todas as letras B pelo
...
25
limpe a tela e exiba a matriz trocando todas as letras B pelo
caractere bloco: ‘█’ (código ascii extendido=219).

Continue navegando