Programar em C
185 pág.

Programar em C


DisciplinaLinguagem de Programação Estruturada128 materiais1.055 seguidores
Pré-visualização40 páginas
de procura pode
ser especificado pela opção /libpath:diretório.
Entrada e saída em arquivos
Trabalhando com arquivos
Já vimos como podemos receber e enviar dados para usuário através do teclado e da tela; agora veremos também
como ler e gravar dados em arquivos, o que é aliás muito importante ou até essencial em muitas aplicações.
Assim como as funções de entrada/saída padrão (teclado e tela), as funções de entrada/saída em arquivos estão
declaradas no cabeçalho stdio.h que significa "STanDard Input-Output". Aliás, as funções para manipulação de
arquivos são muito semelhantes às usadas para entrada/saída padrão. Como já dissemos na seção sobre a entrada e
saída padrões, a manipulação de arquivos também se dá por meio de fluxos (streams).
Na manipulação de um arquivo, há basicamente três etapas que precisam ser realizadas:
1.1. abrir o arquivo;
2.2. ler e/ou gravar os dados desejados;
3.3. fechar o arquivo.
Em C, todas as operações realizadas com arquivos envolvem seu identificador de fluxo, que é uma variável do tipo
FILE * (sobre o qual não cabe agora falar). Para declarar um identificador de fluxo, faça como se fosse uma
variável normal:
FILE *fp; // não se esqueça do asterisco!
Abrindo e fechando um arquivo
Não surpreendentemente, a primeira coisa que se deve fazer para manipular um arquivo é abri-lo. Para isso, usamos
a função fopen(). Sua sintaxe é:
FILE *fopen (char *nome_do_arquivo, char *modo_de_acesso);
\u2022 O nome do arquivo deve ser uma string ou com o caminho completo (por exemplo,
/usr/share/appname/app.conf ou C:\Documentos\nomes.txt) ou o caminho em relação ao
diretório atual (nomes.txt, ../app.conf) do arquivo que se deseja abrir ou criar.
\u2022\u2022 O modo de acesso é uma string que contém uma seqüência de caracteres que dizem se o arquivo será aberto para
gravação ou leitura. Depois de aberto o arquivo, você só poderá executar os tipos de ação previstos pelo modo de
acesso: não poderá ler de um arquivo que foi aberto somente para escrita, por exemplo. Os modos de acesso estão
descritos na tabela a seguir.
Entrada e saída em arquivos 133
Modo Significado
r Abre o arquivo somente para leitura. O arquivo deve existir. (O r vem do inglês read, ler)
r+ Abre o arquivo para leitura e escrita. O arquivo deve existir.
w Abre o arquivo somente para escrita no início do arquivo. Apagará o conteúdo do arquivo se ele já existir, criará um arquivo novo se não
existir. (O w vem do inglês write, escrever)
w+ Abre o arquivo para escrita e leitura, apagando o conteúdo pré-existente.
a Abre o arquivo para escrita no final do arquivo. Não apaga o conteúdo pré-existente. (O a vem do inglês append, adicionar, apender)
a+ Abre o arquivo para escrita no final do arquivo e leitura.
Em ambientes DOS/Windows, ao ler arquivos binários (por exemplo, programas executáveis ou certos tipos de
arquivos de dados), deve-se adicionar o caractere "b" ao final da string de modo (por exemplo, "wb" ou "r+b") para
que o arquivo seja lido/gravado corretamente.
Isso é necessário porque no modo texto (o padrão quando não é adicionado o b) ocorrem algumas traduções de
caracteres (por exemplo, a terminação de linha "\r\n" é substituída apenas por "\n" na leitura) que poderiam afetar a
leitura/gravação dos arquivos binários (indevidamente inserindo ou suprimindo caracteres).
\u2022\u2022 O valor de retorno da função fopen() é muito importante! Ele é o identificador do fluxo que você abriu e é só com
ele que você conseguirá ler e escrever no arquivo aberto.
\u2022 Se houver um erro na abertura/criação do arquivo, a função retornará o valor NULL. O erro geralmente acontece
por duas razões:
\u2022\u2022 O arquivo não existe, caso tenha sido requisitado para leitura.
\u2022\u2022 O usuário atual não tem permissão para abrir o arquivo com o modo de acesso pedido. Por exemplo, o arquivo
é somente-leitura, ou está bloqueado para gravação por outro programa, ou pertence a outro usuário e não tem
permissão para ser lido por outros.
Ao terminar de usar um arquivo, você deve fechá-lo. Isso é feito pela função fclose():
int fclose (FILE *fluxo);
\u2022\u2022 O único argumento é o identificador do fluxo (retornado por fopen). O valor de retorno indica o sucesso da
operação com o valor zero.
Exemplo
Um pequeno exemplo apenas para ilustrar a abertura e fechamento de arquivos:
 #include <stdio.h>
 
 int main()
 {
 FILE *fp;
 fp = fopen (&quot;README&quot;, &quot;w&quot;);
 if (fp == NULL) {
 printf (&quot;Houve um erro ao abrir o arquivo.\n&quot;);
 return 1;
 }
 printf (&quot;Arquivo README criado com sucesso.\n&quot;);
 fclose (fp);
 return 0;
 }
Entrada e saída em arquivos 134
Arquivos pré-definidos
Na biblioteca padrão do C, existem alguns fluxos pré-definidos que não precisam (nem devem) ser abertos nem
fechados:
\u2022 stdin: dispositivo de entrada padrão (geralmente o teclado)
\u2022 stdout: dispositivo de saída padrão (geralmente o vídeo)
\u2022 stderr: dispositivo de saída de erro padrão (geralmente o vídeo)
\u2022 stdaux: dispositivo de saída auxiliar (em muitos sistemas, associado à porta serial)
\u2022 stdprn: dispositivo de impressão padrão (em muitos sistemas, associado à porta paralela)
Escrevendo em arquivos
Para escrever em arquivos, há quatro funções, das quais três são análogas às usadas para saída padrão:
Saída padrão Arquivos Explicação
putchar fputc Imprime apenas um caractere.
puts fputs Imprime uma string diretamente, sem nenhuma formatação.
printf fprintf Imprime uma string formatada.
N/A fwrite Grava dados binários para um arquivo.
A seguir apresentamos os protótipos dessas funções:
void fputc (int caractere, FILE *fluxo);
void fputs (char *string, FILE *fluxo);
void fprintf (FILE *fluxo, char *formatação, ...);
int fwrite (void *dados, int tamanho_do_elemento, int num_elementos, FILE *fluxo);
\u2022\u2022 Sintaxe quase igual à de printf(); só é necessário adicionar o identificador de fluxo no início.
fwrite
\u2022\u2022 Essa função envolve os conceitos de ponteiro e vetor, que só serão abordados mais tarde.
Lendo de arquivos
Novamente, há quatro funções, das quais três se assemelham às usadas para a saída padrão:
Saída padrão Arquivos Explicação
getchar fgetc Recebe apenas um caractere.
gets fgets Lê uma string (geralmente uma linha inteira).
scanf fscanf Recebe uma string formatada.
N/A fread Lê dados binários de um arquivo.
int fgetc (FILE *fluxo);
void fgets (char *string, int tamanho, FILE *fluxo);
void fscanf (FILE *fluxo, char *formatação, ...);
int fread (void *dados, int tamanho_do_elemento, int num_elementos, FILE *fluxo);
Este módulo tem a seguinte tarefa pendente: criar exemplos de uso das funções
Entrada e saída em arquivos 135
fgetc
\u2022 Está função requer como parâmetro o indicador de fluxo do arquivo, retorna um caractere do arquivo ou EOF,
caso ocorra um erro ou o final do arquivo seja atingido, podendo ser verificado respectivamente por ferror e feof.
Exemplo
#include <stdio.h>
#include <stdlib.h>
int main()
{
 FILE *fl;
 int c;
 if((fl = fopen(&quot;caminho/do/arquivo&quot;, &quot;r&quot;)) == NULL)
 {
 perror(&quot;Erro: fopen&quot;);
 exit(EXIT_FAILURE);
 }
 while((c = fgetc(fl)) != EOF)
 printf(&quot;Caractere lido: %c\n&quot;, c);
 if((c == EOF) && (feof(fl) == 0) && (ferror(fl) != 0))
 perror(&quot;Erro: fgetc&quot;);
 
 fclose(fl);
 return EXIT_SUCCESS;
}
fgets
\u2022\u2022 Ao chamar a função fgets(), você deve fornecer o ponteiro para a string onde os dados lidos devem ser guardados,
além do tamanho máximo dos dados a serem lidos (para que a memória reservada à string não seja ultrapassada).
fscanf
\u2022\u2022 Sintaxe quase igual à de scanf(); só é necessário adicionar o identificador de fluxo no início.
fread
\u2022\u2022 Essa função envolve os conceitos de ponteiro e vetor, que só serão abordados mais tarde.
Outras funções
Entrada e saída em arquivos 136
Função Explicação
feof Detecta