A
RQUIVOS DET
EXTONa aula de hoje, a escrita e leitura de dados em arquivos de texto será abordada.
A linguagem C manipula arquivos com o uso de fluxos de dados, chamados de streams. Um stream é um fluxo de dados associado a um dispositivo físico, podendo este ser uma impressora, a tela de um computador ou até mesmo um arquivo do disco. A utilização de streams torna o processo de entrada e saída de dados “independente” do dispositivo. Essa abstração facilita o desenvolvimento de programas.
Existem dois tipos básicos de fluxos de dados na linguagem C: streams de texto e streams binárias.
No fluxo de texto o que transita pelo fluxo são caracteres, dessa maneira, os caracteres enviados pelo fluxo podem sofrer conversões de acordo com a plataforma. Por exemplo, o caractere ‘\n’ não possui a mesma representação numérica nos sistemas UNIX e WINDOWS. No UNIX, apenas o caractere de controle alimentação de linha é enviado, enquanto no WINDOWS, dois caracteres de controle são enviados: retorno de carro e alimentação de linha.
No fluxo binário, números brutos transitam pelo fluxo, portanto esses números não sofrem alterações, sendo independentes da plataforma onde o fluxo está ocorrendo.
A base para a manipulação de arquivos em C são as funções disponíveis na biblioteca de entrada e saída padrão <stdio.h>. As principais funções são apresentadas abaixo:
ESCREVENDO EM UM ARQUIVO DE TEXTO
Estude o Programa 1. #include <stdio.h> #include <stdlib.h> int main(void) {FILE *p; //ponteiro para arquivo...
p = fopen("TESTE.txt", "w"); //abrindo arquivo para escrita if(p == NULL) printf("Problemas ao abrir o arquivo..."); else
{
putc('O', p); putc('L', p);
putc('A', p); //escrevendo caracteres
putc('\n', p);
fputs("Escrevendo em um arquivo\n", p); //escrevendo string
fprintf(p,"Escrevendo numero: %d e %f", 10, 4.3e-2); //escrevendo + coisas
fclose(p); //fechado arquivo
}
system("PAUSE"); return 0;
}
Programa 1 Escrevendo em um arquivo de texto.
Perceba a primeira linha do programa principal.
FILE *p;
Essa linha declara um ponteiro para arquivo. Este ponteiro indicará em qual arquivo ou dispositivo o programa está escrevendo ou de qual dispositivo ou arquivo a leitura é efetuada. Ele é recorrentemente utilizado nas funções de entrada e saída de dados.
A segunda linha:
p = fopen("TESTE.txt", "w");
Faz com que um arquivo com nome TESTE.txt seja aberto em modo escrita. A primeira string enviada para a função como parâmetro informa o nome do arquivo. A segunda string enviada como parâmetro da função indica o modo como o arquivo será aberto. Os modos são apresentados abaixo.
A terceira linha verifica se o arquivo foi aberto corretamente. É imprescindível verificar se
fopen() teve sucesso. Isso é facilmente realizado, uma vez que em caso de erro, a função fopen() retorna NULL (NULL é uma definição). A linha:
if(p == NULL) printf("Problemas ao abrir o arquivo...");
Realiza esta tarefa.
Caso nenhum arquivo com o nome especificado for encontrado, um arquivo será automaticamente criado
A função putc() escreve no arquivo apontado por p um caractere.
.
A função fputs() escreve no arquivo apontado por p uma string.
A função fprintf() funciona exatamente da mesma maneira que a função printf(),
porém enviando os caracteres para um arquivo ao invés de para o terminal. Após a operação com o arquivo, a função fclose() fecha o arquivo.
É muito importante perceber que quando o modo “w” é selecionado e um arquivo com o nome especificado em fopen() existe, esse arquivo será sobre-escrito, e o conteúdo original será
perdido
Exercício 1 Escreva um programa que leia 10 strings do teclado e salve as strings digitadas em um
arquivo com nome especificado pelo próprio usuário do programa.
. Quando se deseja adicionar texto a um arquivo, deve-se abrir o arquivo com o modo “a”.
Exercício 2 Rode o programa acima algumas vezes utilizando o modo “w” e observe o que ocorre
LENDO UM ARQUIVO DE TEXTO
A leitura de um arquivo de texto é feita de maneira semelhante ao realizado anteriormente, porém, as funções de leitura serão utilizadas e o modo de abertura dos arquivos será diferente. Observe o Programa 2, onde o arquivo criado no Programa 1 será lido e impresso na tela.
#include <stdio.h> #include <stdlib.h> int main(void) {
FILE *p; //ponteiro para arquivo...
char str[1000], c; int i;
float f;
p = fopen("TESTE.txt", "r"); //abrindo arquivo para leitura if(p == NULL) printf("Problemas ao abrir o arquivo..."); else
{
c = getc( p ); //realiza a leitura um caractere do arquivo apontado por p.
putchar( c ); //imprime caractere no terminal
putchar( '\n' ); //quebra linha terminal
fgets(str, 1000, p); // realiza a leitura uma linha (ou 1000 caracteres)
puts( str ); //imprime a string lida
fgets(str, 1000, p); // realiza a leitura uma linha (ou 1000 caracteres)
puts( str ); //imprime a string lida
fscanf(p, "%s", str); //scanf le string até espaço...
puts( str ); //imprime a string lida
fscanf(p, "%s", str);
puts( str ); //imprime a string lida
fscanf(p, "%d", &i); //lendo um inteiro
printf("%d", i); //imprimindo o inteiro na tela
putchar( getc(p) ); putchar( getc(p) ); putchar( getc(p) ); fscanf(p,"%f",&f); //lendo um float
printf("%e",f); //imprimindo um float na tela
putchar('\n');
fclose(p); //fechando arquivo
}
system("PAUSE"); return 0;
}
Programa 2 Lendo um arquivo.
O processo de leitura (principalmente utilizando fscanf()) é um pouco mais complicado,
pois é necessário saber como os dados são armazenados no arquivo de modo a realizar a leitura de números. É importantíssimo perceber que não é o número 10 que está armazenado no arquivo, e sim sua representação ASCII. Quando se deseja trabalhar com dados binários – ou brutos, aconselha-se utilizar outras funções que não serão apresentadas nesta disciplina: as funções
A função getc() realiza a leitura de um caractere do arquivo. A função fgets() realiza a
leitura de uma string do arquivo até que o caractere de nova linha seja encontrado ou até um número especificado de caracteres (o que ocorrer antes).
A função getc() retorna EOF (uma definição – end of file) quando o final do arquivo for
alcançado. Estude o programa abaixo.
#include <stdio.h> #include <stdlib.h> int main(void) {
FILE *p; //ponteiro para arquivo...
char c;
p = fopen("TESTE.txt", "r"); //abrindo arquivo para leitura if(p == NULL) printf("Problemas ao abrir o arquivo..."); else
{
c = getc( p ); while( c != EOF ) {
putchar( c ); //imprime caractere no terminal
c = getc( p ); //lendo um caractere do arquivo apontado por p.
}
putchar('\n'); }
fclose(p); //fechando arquivo
system("PAUSE"); return 0;
}
Programa 3 Utilizando EOF para ler todo arquivo de texto.
Exercício 3 Utilize a rotina acima para abrir qualquer arquivo de texto de seu computador
imprimindo todo o conteúdo do arquivo na tela. Cuidado. Indique o modo leitura.
É possível, ainda, remover arquivos utilizando a função remove(). Basta informar a função
através de uma string o nome do arquivo a ser deletado. O Programa 4 apaga o arquivo TESTE.txt manipulado até agora. Estude-o.
#include <stdio.h> #include <stdlib.h> int main(void) {
if( remove("TESTE.txt") ) printf("Problemas ao abrir o arquivo...\n"); else printf("Arquivo deletado...\n");
system("PAUSE"); return 0;
}
Programa 4 Removendo arquivos.
Exercício 4 Desenvolva um programa que realiza a leitura de um arquivo de texto, copiando o