Inicio Fóruns Wiki Videos Galeria Comunidades Empregos FAQ Termos de Uso Contato Sobre Twitter Facebook Linkedin

Visite também: Br-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]
Página Discussão Ver código História

Tutoriais/Programacao/arquivos-c

Leitura e Gravação de Arquivos em C


Programas que manipulam arquivos são fundamentais, principalmente em sistemas Unix, onde muitas informações importantes como configurações ficam em arquivos que podem ser facilmente acessados ou gerados por programas atraves de diversas funções. Leitura e Gravação de Arquivos por minero_CODIng

Tabela de conteúdo

Pequena Introdução

Programas que manipulam arquivos são fundamentais, principalmente em sistemas Unix, onde muitas informações importantes como configurações ficam em arquivos que podem ser facilmente acessados ou gerados por programas atraves de diversas funções.

fopen() e fclose()

Abrindo um arquivo com fopen()

FILE fopen(const char *nome_arquivo, const char *modo);

Modo

a 	Abre um arquivo para operações de anexação - se o arquivo não existe o própriosistema operacional vai cria-lo.
r 	Abre um arquivo existente para operação de leitura
w 	Abre um novo arquivo para saida (write) - Ele ira criar o arquivo, caso o arquivo ja exista ira sobrescrever.
r+ 	Abre um arquivo existente para leitura e gravação.
w+ 	Abre um novo arquivo para gravação, caso este arquivo ja exista, o sistema operacional ira sobrescreve-lo.
a+ 	Abre um arquivo para anexação e leitura - se o arquivo não exister, o sistema operacional vai cria-lo.

Fechando arquivo com fclose()

int fclose(FILE *ponteiro_arquivo);

Exemplo fopen()-fclose()

#include

int main(){

FILE *arquivo;

arquivo = fopen("meuprog.config", "w"); //abre arquivo para saida
fclose(arquivo); //fecha arquivo

}

Funções de Leitura e Gravação

Bem, não basta so abrir o arquivo, é necessário fazer alguma operação nele, como ler ou gravar, para isso temos varias funções, vou mostrar algumas dessas funções!

Lendo com fgetc()

int fgetc(FILE *ponteiro_arquivo_entrada);

Basta criar um arquivo logicamente em modo de leitura e usar fgetc para pegar carac- tere por caractere, fgetc() pega um caractere por vez e em valor inteiro, ou seja, va- lor correspondente na tabela ASCII, por exemplo:

int letra;
letra = fgetc(arquivo);

caso o arquivo correspondente ao ponteiro *arquivo tenha apenas uma letra 'a', o valor da varivel letra será 97, que é o numero correspondente a 'a' na tabela ASCII.

Gravando com fputc()

fputc() funciona da mesma maneira so que para gravar, olhe só:

int fputc(int caractere, FILE *ponteiro_arquivo_saida);

Caso vc queira gravar a letra 'a', vc coloca:

fputc(97, arquivo);

Exemplo fgetc()-fputc()

- Exemplo reproduz_arquivo.c

#include

int main(){

FILE *entrada, *saida;
int letra;

entrada = fopen("arquivo1", "r"); //abre para leitura!
saida = fopen("arquivo2", "w"); //abre para escrita

while((letra = fgetc(entrada)) != EOF){ //le arquivo1

fputc(letra, saida); //escreve letra no arquivo2
}

fclose(entrada);
fclose(saida);
}

Este programa simplesmente reproduz o arquivo1, ou seja, ele pega o conteudo do arquivo1 e escreve no arquivo2, pegando caractere por caractere.

Pegando uma String com fgets()

char *fgets(char string, int limite, FILE *canal);

A função fgets() pega uma linha inteira, assim voce naum precisa pegar cactere por caractere, veja como é simples de usar:

- Exemplo pegalinha.c

#include

int main(int argc, char **argv){ //main vai usar argumentação

FILE *arquivo;
char string[1024]; //string onde ficara a linha
int x = 0;

arquivo = fopen(argv[1], "r");

while(fgets(string, sizeof(string), arquivo)){ //le arquivo
x = x+1;
printf("Linha:%d : %s",x, string); //imprime na tela as linhas
}
fclose(arquivo); //fecha arquivo

Este é um simples programa q pega linha por linha do arquivo e imprime na tela. Ele também usa argumentação, para quem nunca usou argumentação, é bem simples!

Voce compilou o pegalinha.. dae vc executa:

$ ./pegalinha arquivo

"arquivo" = argv[1]

$ ./pegalinha oi mundo lazarento da porra

"oi" = argv[1]
"mundo" = argv[2]
"lazarento" = argv[3]
"da" = argv[4]
"porra" = argv[5]

simples naum é? cada argumento é separado por espaço e salvado em uma posição do array argv[] , para vc usar argumentação é necessario declarar no man():

int main(int argc, char **argv){

ou

int main(int argc, char *argv[]){

No caso do pegalinha argv[1] é o path do arquivo que se deseja ler!

Gravando uma string com fputs()

int fputs(const char *string, FILE *canal);

Bem simples.. olhe o exemplo:

- Exemplo escreve_arquivo.c

#include

int main(int argc, char **argv){ //main vai usar argumentação

FILE *arquivo;
char entrada[1024];
int x = 1;

arquivo = fopen(argv[1], "w");

while(strcmp(entrada, "!sair")){ //verifica se entrada é diferente de "!sair"

printf("Linha: %d :", x);
gets(entrada); //pega entrada, entrada do usuario

if (strcmp(entrada, "!sair")){
fputs(entrada, arquivo); //escreve entrada m arquivo
fputc(10, arquivo); //imprime pulo de linha
}

x++;
}
fclose(arquivo);
}

Este é um simples programa para voce escrever arquivos linha a linha, basta digitar "!sair", que o programa fecha e salva o arquivo.

Gravando uma string com fprintf()

int fprintf(FILE *ponteiro_arquivo, const char *formato, [argumento]);

O fprintf() é semelhante ao fputs(), exceto pela vantagem de poder especificar o formato que sera usado na hora de gravar! veja ese exemplo:

fprintf.c

#include

int main(){
int x=97;

FILE *arquivo;

arquivo = fopen("teste", "w");

fprintf(arquivo, "%d ", x); //imprime inteiro x
fprintf(arquivo, "%c ", x); //imprime caractere x
fprintf(arquivo, "%x ", x); //imprime hexadecimal x
fprintf(arquivo, "%o ", x); //Imprime Octal x

fclose(arquivo);
}

Voce pode ver q fprintf() grava a variavel x em diversos formatos, olhe só o conteu- do do arquivo "teste":

teste
97
a
61
141

Ou seja:

97	Inteiro x
a	Caractere x baseado tabela ascii
61 	Hexadecimal x
141	Octal x

Abrindo e Fechando Arquivos com função de baixo nível

Para abrir e fechar arquivos em baixo nível vamos utilizar as funções open() e close()

int open(const char *caminho, int modo_de_acesso [, modo_criação]);

Se tudo ocorrer com sucesso, open() retornará um indicativo para o arquivo, caso ocorra um erro, open() retornará -1 e definira a variavel global errno com um dos valores abaixo:

  • EMFILE Arquivos demais abertos
  • ENOENT Não existe essa entrada de arquivo ou diretório
  • EACCES Permissão de acesso negada
  • EINVACC Código de acesso invalido

Para o parametro modo de acesso temos as seguintes opções:

  • O_RDONLY Acesso de leitura somente.
  • O_WRONLY Acesso de gravação somente.
  • O_RDWR Acesso de leitura e gravação.
  • O_NDELAY Valor de retardo que o UNIX usa.
  • O_APPEND Posiciona os ponteiros para as opções de anexação.
  • O_TRUNC Trunca o conteúdo de um arquivo existente.
  • O_EXCL Se O_CREAT está especificado e o arquivo ja existe, open retorna um erro.
  • O_BINARY Abre arquivo no modo binário.
  • O_TEXT Abre arquivo no modo texto.


Parametro modo de criação:

  • S_IWRITE Cria para operações de gravação.
  • S_IREAD Cria para operações de leitura.

close()

int close(int close);<pre>

Dificil hein??? ;)

'''Gravando com write()'''

<pre>int write(int indicativo, void *buffer, unsigned tamanho);

Lendo com read()

int read(int indicativo, void *buffer, unsigned tamanho);

Exemplo read()-write(); reproduz_arquivo2.c

#include

int main(){

int entrada;
int saida;
int bytes_lidos;
char buffer[1024];

entrada = open("arquivo1" , O_RDONLY | S_IREAD);
saida = open("arquivo2", O_WRONLY | O_CREAT, S_IWRITE);

while ((bytes_lidos = read(entrada, buffer, sizeof(buffer))) > 0){
write(saida, buffer, bytes_lidos);
}
close(entrada);
close(saida);
}

Programa que pega o conteudo do arquivo1 e escreve no arquivo2, mas agora usando read() write()

Posicionando ponteiro com a função lseek() e fseek()

long lseek(int indicativo, long desloc, int relativo_a);
int fseek(FILE *canal, long desloc, int relativo_a);

Usa-se fseek com fopen() e lseek com open(). As duas funções são praticamente iguais por isso serão tratadas juntas.

Valores do relativo_a:

  • SEEK_CUR A partir da posição atual do arquivo.
  • SEEK_SET A partir do início do arquivo.
  • SEEK_END A partir do final do arquivo.
lseek(arquivo, 0, SEEK_END); //posiciona o ponteiro no final do arquivo

Isso significa que se você usar o write() no caso do open() ou usar fprintf() no caso do fopen(), ele vai anexar o texto no final do arquivo.

lseek(arquivo, 0, SEEK_SET); //posiciona o ponteiro no inicio do arquivo

Isso significa que se você usar o write() no caso do open() ou usar fprintf() no caso do fopen(), ele vai anexar o texto no início do arquivo.


lseek(arquivo, 0, SEEK_CUR); //posiciona o ponteiro na posição atual do arquivo

Isso significa que se você usar o write() no caso do open() ou usar fprintf() no caso do fopen(), ele vai anexar o texto na posição atual no arquivo.

Exemplos lseek() e fseek()

- Exemplo fseek.c


#include
#include
#include
#include

int main(){

FILE *arquivo;
arquivo = fopen("teste", "a+");

fseek(arquivo, 0, SEEK_END); //posiciona ponteiro no final do arquivo!

fprintf(arquivo, "Adiciona linha :) ");

fclose(arquivo);
}

- Exemplo lseek.c

#include
#include
#include
#include

int main(){

int arquivo;
arquivo = open("teste", O_WRONLY | O_CREAT, S_IWRITE);

lseek(arquivo, 0, SEEK_END); //posiciona ponteiro no final do arquivo!

write(arquivo, "Adiciona linha :) ", strlen("Adiciona linha :) "));

close(arquivo);
}

Bem.. como pode-se ver, foi usada a opção de anexação no final do arquivo, ou seja, se você executar qualquer um dos dois exemplos 3 vezes, o arquivo "teste" terá o seguinte conteúdo:

teste

Adiciona linha :)
Adiciona linha :)
Adiciona linha :)

Repare que no exemplo usando fopen() o parametro modo é "a+", isso para não sobrescrever o arquivo. Caso não posicionassemos os ponteiros nos dois casos os arquivos seriam sobrescritos e o conteúdo do "teste" seria apenas uma linha "Adiciona linha :)".

Conclusão

Bem é isso ae pessoal, eu sei que existem muitas outras funções e outras tantas coisas para mexer relacionadas com acesso a arquivos, mas por enquanto é só isso pessoal! Qual- quer dúvida, problema, sujestão, entre em contato comigo na brasnet!

Por minero_CODIng. =D


Powered by MediaWiki