Mudanças entre as edições de "SOP-arquivos"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 5: Linha 5:
 
Para um programador, arquivos são repositórios permanentes de dados, os quais usualmente ficam em midia não volátil (disco rígido, CD ou DVD, pendrive, e outros). Arquivos servem para guardar informações que devem continuar a existir mesmo que termine o processo que as criou. Um exemplo é a agenda, cujo conteúdo deve ser preservado para futuras consultas e modificações. Mas além de serem depósitos de dados, arquivos possuem características bem definidas do ponto de vista de programação.
 
Para um programador, arquivos são repositórios permanentes de dados, os quais usualmente ficam em midia não volátil (disco rígido, CD ou DVD, pendrive, e outros). Arquivos servem para guardar informações que devem continuar a existir mesmo que termine o processo que as criou. Um exemplo é a agenda, cujo conteúdo deve ser preservado para futuras consultas e modificações. Mas além de serem depósitos de dados, arquivos possuem características bem definidas do ponto de vista de programação.
  
Um arquivo é uma sequência de bytes, que pode ser acessada, lida e modificada por meio de funções específicas existentes na [http://pt.wikipedia.org/wiki/Biblioteca_padr%C3%A3o_do_C biblioteca padrão da linguagem C]. Essas funções servem para abrir e fechar um arquivo, ler e escrever uma certa quantidade de bytes, e mudar a posição da próxima leitura ou escrita. Abaixo segue um exemplo de um programa para escrever uma linha em um arquivo:
+
Um arquivo é uma sequência de bytes, que pode ser acessada, lida e modificada por meio de funções específicas existentes na [http://pt.wikipedia.org/wiki/Biblioteca_padr%C3%A3o_do_C biblioteca padrão da linguagem C]. Essas funções servem para abrir e fechar um arquivo, ler e escrever uma certa quantidade de bytes, e mudar a posição da próxima leitura ou escrita.
 +
 
 +
=== Escrevendo em um arquivo ===
 +
 
 +
Abaixo segue um exemplo de um programa para escrever uma linha em um arquivo:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 52: Linha 56:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Uma vez o arquivo estando aberto para escrita, pode-se escrever nele usando-se a função ''fprintf''. Essa função é idêntica à função ''printf'' que se usa para escrever na tela, com exceção do primeiro parâmetro que deve ser a variável que corresponde ao arquivo aberto:
+
Uma vez o arquivo estando aberto para escrita, pode-se escrever nele usando-se a função ''fprintf''. Essa função é idêntica à função ''printf'' que se usa para escrever na tela. Porém ''fprintf'' precisa de um parâmetro adicional, deve ser a variável que corresponde ao arquivo aberto (primeiro parâmetro da função):
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
   fprintf(arquivo, "%s\n", linha);
 
   fprintf(arquivo, "%s\n", linha);
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
Finalmente, quando não se quer mais escrever no arquivo deve-se chamar a função ''fclose'' para fechá-lo:
 +
 +
<syntaxhighlight lang=c>
 +
  fclose(arquivo);
 +
</syntaxhighlight>
 +
 +
=== Lendo de um arquivo ===
 +
 +
A leitura de um arquivo é parecida, com algumas pequenas modificações em sua abertura (deve-se indicar que o mode de operação será "r", de "read"), e usando-se a função ''fscanf'' para ler dados do arquivo. O exemplo abaixo mostra um programa para ler a primeira linha de um arquivo:
 +
 +
<syntaxhighlight lang=c>
 +
#include<stdio.h>
 +
 +
int main() {
 +
  char linha[1024];
 +
  char nome[256];
 +
  FILE * arquivo;
 +
 +
  printf("Digite o nome de um arquivo: ");
 +
  scanf("%s", nome);
 +
 
 +
  printf("Vou mostrar a primeira linha do arquivo %s\n", nome);
 +
 +
  arquivo = fopen(nome, "r");
 +
  if (arquivo == NULL) {
 +
    perror("Ops ... erro ao acessar esse arquivo: ");
 +
    return 1;
 +
  }
 +
 +
  fgets(linha, 1024, arquivo);
 +
  fclose(arquivo);
 +
 +
  printf("Eis a primeira linha do arquivo: \n\n%s\n\n", linha);
 +
 +
}
 +
</syntaxhighlight>
 +
 +
Como adiantado, na abertura com ''fopen'' deve-se usar o valor "r" para o modo:
 +
 +
<syntaxhighlight lang=c>
 +
  arquivo = fopen(nome, "r");
 +
</syntaxhighlight>
 +
 +
Já a leitura de uma linha pode ser feita mais facilmente com a função ''fgets'':
 +
 +
<syntaxhighlight lang=c>
 +
  fgets(linha, 1024, arquivo);
 +
</syntaxhighlight>
 +
 +
A função ''char * fgets(char * resultado, int max_caracteres, FILE * arquivo)'' lê uma linha de um arquivo com até ''max_caracteres'' e a guarda na variável passada no parâmetro ''resultado''. No exemplo acima, ''fgets'' lê uma linha com até 1024 caracteres e a guarda na variável ''linha''.

Edição das 19h50min de 15 de novembro de 2009

Arquivos na linguagem C

Arquivos do ponto de vista de programação

Para um programador, arquivos são repositórios permanentes de dados, os quais usualmente ficam em midia não volátil (disco rígido, CD ou DVD, pendrive, e outros). Arquivos servem para guardar informações que devem continuar a existir mesmo que termine o processo que as criou. Um exemplo é a agenda, cujo conteúdo deve ser preservado para futuras consultas e modificações. Mas além de serem depósitos de dados, arquivos possuem características bem definidas do ponto de vista de programação.

Um arquivo é uma sequência de bytes, que pode ser acessada, lida e modificada por meio de funções específicas existentes na biblioteca padrão da linguagem C. Essas funções servem para abrir e fechar um arquivo, ler e escrever uma certa quantidade de bytes, e mudar a posição da próxima leitura ou escrita.

Escrevendo em um arquivo

Abaixo segue um exemplo de um programa para escrever uma linha em um arquivo:

#include<stdio.h>

int main() {
  char linha[256];
  FILE * arquivo;

  printf("Digite uma linha: ");
  scanf("%[^\n]", linha);
  
  printf("Vou gravar isto no arquivo teste.txt\n");
  arquivo = fopen("teste.txt", "w");
  if (arquivo == NULL) {
    perror("Nao conseguiu abrir o arquivo");
    return 1;
  }
  fprintf(arquivo, "%s\n", linha);
  fclose(arquivo);

  printf("Pronto ... veja o arquivo teste.txt !\n");

}

Esse pequeno programa evidencia que trabalhar com arquivos é muito parecido a trabalhar com escrita na tela e leitura do teclado. Mas primeiro deve-se focar nas linhas do programa que têm relação direta com arquivos. Para começar, um arquivo é referenciado por uma variável do tipo FILE *:

  FILE * arquivo;

Em seguida, o arquivo a ser lido ou escrito deve ser aberto, usando-se a função FILE * fopen(char * nome_arquivo, char * modo):

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

Como se pode ver, a função fopen precisa de dois parâmetros do tipo char * (quer dizer, dois parâmetros string). O primeiro é o caminho do arquivo a ser aberto, e o segundo é o modo de abertura (o que se pretende fazer com ele: ler, escrever, adicionar dados ao final, ler e escrever). No exemplo acima, vai-se abrir o arquivo teste.txt para escrita (modo "w", de write). O valor de retorno de fopen é do tipo FILE *, e corresponde a uma descrição do arquivo que foi aberto. Caso aconteça algum erro (ex: não há permissão para criar o arquivo), fopen retorna o valor NULL. O exemplo testa se isto acontece da seguinte forma:

  if (arquivo == NULL) {
    perror("Nao conseguiu abrir o arquivo");
    return 1;
  }

Uma vez o arquivo estando aberto para escrita, pode-se escrever nele usando-se a função fprintf. Essa função é idêntica à função printf que se usa para escrever na tela. Porém fprintf precisa de um parâmetro adicional, deve ser a variável que corresponde ao arquivo aberto (primeiro parâmetro da função):

  fprintf(arquivo, "%s\n", linha);

Finalmente, quando não se quer mais escrever no arquivo deve-se chamar a função fclose para fechá-lo:

  fclose(arquivo);

Lendo de um arquivo

A leitura de um arquivo é parecida, com algumas pequenas modificações em sua abertura (deve-se indicar que o mode de operação será "r", de "read"), e usando-se a função fscanf para ler dados do arquivo. O exemplo abaixo mostra um programa para ler a primeira linha de um arquivo:

#include<stdio.h>

int main() {
  char linha[1024];
  char nome[256];
  FILE * arquivo;

  printf("Digite o nome de um arquivo: ");
  scanf("%s", nome);
  
  printf("Vou mostrar a primeira linha do arquivo %s\n", nome);

  arquivo = fopen(nome, "r");
  if (arquivo == NULL) {
    perror("Ops ... erro ao acessar esse arquivo: ");
    return 1;
  }

  fgets(linha, 1024, arquivo);
  fclose(arquivo);

  printf("Eis a primeira linha do arquivo: \n\n%s\n\n", linha);

}

Como adiantado, na abertura com fopen deve-se usar o valor "r" para o modo:

  arquivo = fopen(nome, "r");

Já a leitura de uma linha pode ser feita mais facilmente com a função fgets:

  fgets(linha, 1024, arquivo);

A função char * fgets(char * resultado, int max_caracteres, FILE * arquivo) lê uma linha de um arquivo com até max_caracteres e a guarda na variável passada no parâmetro resultado. No exemplo acima, fgets lê uma linha com até 1024 caracteres e a guarda na variável linha.