Manipulação de Ficheiros de texto em Linguagem C – leitura/escrita caracter a caracter

Das várias funções disponíveis para a leitura e escrita de ficheiros de texto byte-a-byte, ou seja, caracter-a-caracter, vou concentrar este pequeno exemplo apenas nas funções fgetc e fputc.

fgetc – Ler um caracter de um ficheiro

Protótipo: int fgetc(FILE *nomeficheiro)

Exemplo de leitura de um caracter:

caracter = fgetc(nome);

Notar que o caracter lido é armazenado na variável caracter, do tipo int, e que a função vai posicionar -se no ficheiro na próxima posição, ou seja, no caracter seguinte. Não há necessidade de invocar funções de posicionamento para esse efeito.

Programa exemplo :

O programa seguinte lê o ficheiro “texto.txt” e conta o número de caracteres.

Para focar apenas o essencial não vou incluir qualquer tipo de verificação (falha de segmentação) e parto do princípio que existe o ficheiro “texto.txt” na directoria onde vamos testar o programa. Será conveniente utilizar um editor de texto para criar o ficheiro de texto, que pode ser algo do tipo:

Agora vamos ao código.

#include <stdio.h>
int main(){
	FILE *fp;			/* apontador para o ficheiro */
	int contador = 0;	/* variável para contar os caracteres */

	/* Abrir o ficheiro */
	fp = fopen("texto.txt", "r");

	/* Contar os caracteres do ficheiro */
	while (fgetc(fp) != EOF)
		contador++;
	printf("Número total de caracteres = %d\n",contador);

	/* Fechar o ficheiro */
	fclose(fp);

	/* Terminar o programa */
	return 0;
}

Observações:

  • O ficheiro é aberto no modo de leitura, e parte-se do princípio que este existe.
  • Cada caracter lido não é armazenado numa variável, sendo utilizado apenas na condição do ciclo “while”.
  • Foi utilizado um ciclo “while” para percorrer o ficheiro byte-a-byte, utilizando a constante simbólica EOF para controlar o fim do ficheiro (EOF=End Of File, cujo valor é -1).
  • Conte atentamente os caracteres do ficheiro de texto, pois até as mudanças de linha são representadas por um caracter “invisível”.

Caso pretendessemos realizar alguma operação com os caracteres lidos, como por exemplo mostrar o conteúdo do ficheiro antes de apresentar a contagem dos caracteres, facilmente poderíamos alterar o código para a versão apresentada a seguir.

#include <stdio.h>
int main(){
	FILE *fp;			/* apontador para o ficheiro */
	int contador = 0;	/* para contar os caracteres */
	int caracter;		/* inteiro para armazenar cada caracter lido */

	/* Abrir o ficheiro */
	fp = fopen("texto.txt", "r");

	/* Contar os caracteres do ficheiro */
	while ((caracter=fgetc(fp)) != EOF){
		putchar(caracter);
		contador++;
	}
	printf("\nNúmero total de caracteres = %d\n",contador);

	/* Fechar o ficheiro */
	fclose(fp);

	/* Terminar o programa */
	return 0;
}

Observações:

  • A variável “caracter” foi declarada com o tipo “int”. Isto deve-se ao facto de haver necessidade de comparar os caracteres lidos com a constante EOF, que como já referi tem o valor -1, que não é suportado pelo tipo “char”.

fputc – Escrever um caracter num ficheiro

Protótipo: int fputc(int caracter, FILE *nomeficheiro)

Exemplo de escrita de um caracter:

fputc('x', nome);

O caracter ‘x’ é escrito no ficheiro apontado por “nome”.

Programa exemplo :

O programa seguinte armazena uma cadeia de caracteres num ficheiro “texto.txt”. Caso o ficheiro já exista este será substituído.


#include <stdio.h>
int main(){
    FILE *fp;                                /* apontador para o ficheiro */
    char texto[]="que lindo dia\nai ai";    /* texto a enviar para o ficheiro */
    int i=0;                                /* para ler a string caracter a caracter */

    /* Abrir o ficheiro */
    fp = fopen("texto.txt", "w");

    /* Contar os caracteres do ficheiro */
    while (texto[i]!='\ 0')
        fputc(texto[i++], fp);

    /* Fechar o ficheiro */
    fclose(fp);

    /* Terminar o programa */
    return 0;
}

Observações:

  • Não tem nada a ver com linguagem C, mas tive que utilizar um espaço entre os caracteres \ e 0. Caso queiram compilar o programa não se esqueçam de remover este espaço. O plugin que estou a utilizar no WordPress não está a 100%. Corrijo isto assim que me for possível (ver linha 11) .
  • O ficheiro é aberto no modo de escrita “w”, pelo que caso não exista será criado, e caso contrário será substituído ( ver modos de abertura ).
  • A string é percorrida caracter-a-caracter até ser detectado o seu terminador, ou seja, o caracter ”.
  • A instrução fputc(texto[i++], fp); primeiro escreve o caracter no ficheiro, e de seguida incrementa o valor de i.

Anúncios

19 thoughts on “Manipulação de Ficheiros de texto em Linguagem C – leitura/escrita caracter a caracter

  1. gostaria de saber o codigo fonte para guardar o conteudo de uma estrutura num ficheiro de texto. alguem me pode dizer komo se faz?
    foco à espera de uma resposta!

  2. Bom dia malta.
    Preciso de saber como abir ficheiros de texto usando listas(Estruturas Dinâmicas).
    Usando arrays, limitamos a quantidade de caracteres que serao lidos, eu pretendo usar listas com as funçoes maloc(); e free();, mas nao sei como inserir os caracteres lidos para dentro da lista e imprimi-los.
    CD

  3. Claudio Diz:
    Junho 17, 2009 às 1:31 pm
    Será que algeum me pode ajudar?
    Não sei como inserir as palavras lidas de dentro do ficheiro para a LISTA.
    CD

    ———–

    .|.

  4. Olá. Informação muito útil. Eu gostava de saber algo mais. Como é que eu crio um ciclo para ler o ficheiro e comparar todas as strings até ao fim? Eu já consegui em parte, mas ele não começa a comparação do início se encontrar alguma string igual no meio ou no fim do ficheiro. Depois, aceita strings iguais às anteriores no ficheiro no programa e não dá certo.
    Obrigado e comprimentos.

  5. Pessoal, estou com um problema ao passar um arquivo ,txt para uma matriz 20×80… estou usando um laço for, porém ela além de pegar os caracteres, está pegando muito mais q deveria… penso que pode ser o ‘\n’, mas como faria isso usando um while e tirando este problema? obrigado!

  6. olá estou com dificuldades para ler um arquivo e armazenar em variaveis
    P2
    3 2 255
    200 128 24
    255 211 35
    isso e uma imagem PGM, P2 é o tipo, 3 e 2 é coluna e linha, 255 é o valor maximo de um unsigned char pode assumir e o restante e a matriz da imagem, eu tenho que ler este arquivo e armazenar na struct;
    typedef struct {
    int c; // número de colunas na imagem
    int l; // número de linhas na imagem
    unsigned char maximo; // valor máximo para cada pixel
    unsigned char **dados; // variável para armazenar os pixels da imagem (matriz)
    } PGM;
    alguem pode me dar umas dicas!

    1. cara, tenta fazer tipo, um while dentro de outro while – um para acabar a leitura do arquivo, com condição != EOF, e outro pra trocar pra outra variavel de struct (struct precisa ser vetor) – pra quando der espaço, trocar a atribuição, e qnd chegar no \n (condição do while pra acabar) trocar pra uma variável de struct…

      tipo, resumindo:
      while de fora pra acabar o arquivo (!=EOF)
      outro while de dentro para:
      usando if, qnd der espaço, muda as variáveis de uma variável struct
      outro if pra qnd chegar no \n, muda a struct, tipo PGM[0], PGM[1]

      OBS: esse valor [x] tem q ser um contador, qnd der \n usa contador ++

      to meio enferrujado, mas acho que isso deve dar pelo menos uma ideia! abraço

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s