Arquivos
Prof. Luis Otavio Alvares
Introdução
• a linguagem C utiliza o conceito de fluxo (stream)
de dados para manipular vários tipos de
dispositivos de armazenamento.
• Dados podem ser manipulados em dois
diferentes tipos de fluxos: fluxos de texto e fluxos
binários.
• Um fluxo de texto é composto por uma seqüência
de caracteres, que pode ou não ser dividida em
linhas terminadas por um caracter de final de
linha.
Arquivos
• Um arquivo pode estar associado a qualquer
dispositivo de entrada e saída, como por exemplo:
teclado, video, impressora, disco rígido, etc.
• O processo de trabalhar com arquivos em C consiste
em três etapas:
1. Abrir o arquivo;
2. Ler e/ou gravar as informaçõeses desejadas no arquivo;
3. Fechar o arquivo.
Funções de entrada e saída
As funções mais usadas estão armazenadas na biblioteca
stdio.h
•
•
•
•
•
•
•
•
•
•
fopen() - Abre um arquivo
fputc() - Escreve um caracter em um arquivo
fgetc() - Lê um caracter de um arquivo
fputs() – escreve uma string em um arquivo
fgets() – lê uma linha de um arquivo
fprintf()- Equivalente a printf()
fscanf() - Equivalente a scanf()
rewind() - Posiciona o arquivo no início
feof() - Retorna verdadeiro se chegou ao fim do arquivo
fclose() – fecha
Abertura de arquivo
• Antes de qualquer operação ser executada
com o arquivo, ele deve ser aberto. Esta
operação associa um fluxo de dados a um
arquivo.
• Um arquivo pode ser aberto de diversas
maneiras: leitura, escrita, leitura/escrita,
adicão de texto, etc. A função utilizada para
abrir o arquivo é fopen()
A função fopen()
fopen(nome arquivo,modo de uso).
Os modos de uso mais comuns são:
– r (de read) : abre um arquivo texto para leitura
– w (de write) : cria um arquivo texto para escrita
– a (de append) : para adicionar conteúdo no fim de um arquivo
texto já existente
– r+ : abre um arquivo texto para leitura/escrita
– w+ : cria um arquivo texto para leitura/escrita
Exemplo de uso
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *arquivo; //vai ser associada ao arquivo
arquivo = fopen("c:/luis/teste9.txt","r");
if(arquivo==0)
printf("Erro na leitura do arquivo\n");
else
printf("Arquivo aberto com sucesso\n");
fclose(arquivo); //fecha arquivo
system("pause");
}
Leitura e gravação
• fgets (string, tamanho, arquivo)
• fputs(string, arquivo)
• fgetc(arquivo)
• fputc(char, arquivo)
Exemplo: programa que faz copia de um arquivo
//copia o conteudo do arquivo tmp.txt em tmpCopy.txt
#include<stdio.h>
#include<stdlib.h>
#define MAX 80
main(){
int ch;
char linha[MAX];
FILE *input, *output;
// uma forma de copiar (linha a linha)
input = fopen( "tmp.txt", "r" );
if(input){
output = fopen( "tmpCopy2.txt", "w" );
fgets(linha, MAX, input);
while(!feof(input) ) {
fputs( linha, output );
fgets(linha, MAX, input);
}
fputs( linha, output ); //para escrever a ultima linha (do EOF)
fclose( input );
fclose( output );
}
else printf ("deu erro na abertura do arquivo tmp.txt\n");
system("pause");
continuação
// outra forma de copiar (caracter a caracter)
input = fopen("tmp.txt", "r");
if(input){
output = fopen( "tmpCopy.txt", "w" );
ch = fgetc( input );
while( ch != EOF ) {
fputc( ch, output );
ch = fgetc( input );
}
fclose( input );
fclose( output );
}
else printf ("deu erro na abertura do arquivo tmp.txt\n");
system("pause");
}
Exemplo mais completo
// grava o nome de cinco alunos em um arquivo e depois le o arquivo e
// mostra os nomes escritos
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(){
FILE *p;
char c, str[30], frase[80] = "Este e um arquivo chamado: “;
char alunos [5][50], mostratexto [50];
int i,j=0, cont=0;
// Le um nome para o arquivo a ser aberto:
printf("\n\n Entre com um nome para o arquivo:\n");
gets(str);
// le os nomes dos alunos e coloca no vetor alunos
for (cont=0;cont<5;cont++)
{
printf ("\nInforme o nome do aluno %d: ", cont+1);
gets(alunos[cont]);
}
// abre o arquivo para gravacao
if (!(p = fopen(str,"w"))) // Caso ocorra algum erro na abertura
//do arquivo da' mensagem e nao faz nada
{
printf("Erro! Impossivel abrir o arquivo!\n");
}
else {
// Se nao houve erro, grava o arquivo e o fecha ...
for (i=0; i<5; i++){
strcat(alunos[i], "\n"); //concatena o \n no final da linha
fputs(alunos[i],p);
// grava no arquivo p
}
fclose(p); // fecha o arquivo ao final da gravacao
printf("\nTerminei de escrever, agora vou ler.\n");
// Abre novamente, agora para leitura
p = fopen(str,"r");
//uma forma de mostrar
fgets(mostratexto, 50, p);
while (!feof(p)) // Enquanto não chegar no final do arquivo p
{
printf("%s",mostratexto);
fgets(mostratexto, 50, p);
}
fclose(p);
// Fecha o arquivo p
// outra forma de mostrar
printf("\nde novo\n");
p = fopen(str,"r");
for (i=0; i<5; i++){
fgets(alunos[i], 50, p);
printf("%s",alunos[i]);
}
fclose(p);
// Fecha o arquivo
} // do else de erro de abertura do arquivo
system("pause");
}
Exercício
Faça um programa que decodifique um determinado texto gravado em um arquivo,
a partir da seguinte tabela de substituição de caracteres, gerando um novo arquivo:
CARACTER EXISTENTE
SUBSTITUIR POR
A
Z
E
Y
I
X
O
W
U
*
//copia o conteudo do arquivo tmp.txt em tmpCopy.txt, com alteracoes
#include<stdio.h>
#include<stdlib.h>
main(){
int c;
FILE *ent, *sai;
ent = fopen("tmp.txt", "r");
if(ent){
sai = fopen( "tmpCopy.txt", "w" );
c = fgetc( ent );
while( c != EOF ) {
switch (c) {
case 'A': c='Z';break;
case 'E': c='Y';break;
case 'I': c='X';break;
case 'O': c='W';break;
case 'U': c='*';break;
}
fputc( c, sai );
c = fgetc( ent );
}
fclose( ent );
fclose( sai );
}
else printf ("deu erro na abertura do arquivo tmp.txt\n");
system("pause");
}
Exercício
Considere um arquivo tipo texto já gravado.
Gere um novo arquivo com uma nova linha, com dados lidos do
teclado, entre a terceira e a quarta linha deste texto.
Mostre o conteudo do arquivo original e do novo.
Exemplo de solução
//copia o conteudo do arquivo original.txt em copia.txt
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 150
main(){
int i;
char linha[MAX];
FILE *entrada, *saida;
entrada = fopen( "original.txt", "r" );
if(entrada){
saida = fopen( "copia.txt", "w" );
for (i=1;i<4;i++){
fgets(linha, MAX, entrada);//le as primeiras linhas
fputs(linha, saida );
// copia para o arquivo de saida
}
printf("Informe o conteudo da linha a ser inserida: ");
gets(linha);
strcat(linha,"\n");
fputs(linha, saida ); // escreve a linha adicionada
continuação
// copia o resto do arquivo, sem alteracao
fgets(linha, MAX, entrada);
while(!feof(entrada) ) {
fputs( linha, saida );
fgets(linha, MAX, entrada);
}
fputs( linha, saida ); //para escrever a ultima linha (do EOF)
fclose( entrada );
fclose( saida );
}
else printf ("deu erro na abertura do arquivo original.txt\n");
system("pause");
}
Download

Arquivos