Você está visualizando atualmente Arquivo texto com a linguagem de programação C

Arquivo texto com a linguagem de programação C

É emocionante quando vemos nosso primeiro programa funcionando. Contudo, é mais emocionante ainda quando nosso programa produz uma saída mais tangível, como um arquivo, contendo o resultado de seu processamento. Na aula de hoje vamos aprender como ler e escrever dados em um arquivo texto com a linguagem de programação C.

Para iniciar vamos criar um tipo de dado chamado Pessoa. Cada pessoa terá um nome (um vetor de caracteres), uma idade (número inteiro) e sexo (um caracter).

typedef struct{
    char nome[50];
    int idade;
    char sexo;
}Pessoa;

Agora, vamos criar um vetor global do tipo Pessoa chamado lista com capacidade para armazenar 10 Pessoas. Como vamos precisar percorrer esse vetor muitas vezes, criamos também uma variável chamada tam para armazenar o tamanho do vetor. Assim, basta alterar o valor dessa variável para aumentar ou diminuir o tamanho de nosso vetor e todo o programa continua funcionando. Por fim, criamos também uma variável chamada quant para contar quantas pessoas já foram inseridas no vetor.

int tam = 10;
Pessoa lista[10];
int quant = 0;

Agora vamos fazer uma função para inserir uma pessoa em nosso vetor. Esta função retorna 1 se conseguir inserir a nova pessoa e 0 caso contrário. Para sabermos se o vetor está cheio ou não basta verificarmos o valor da variável quant que acabamos de criar.

int cadstrarPessoa(){
    if(quant < tam){ // verifica se há espaço no vetor
        Pessoa p; // cria uma variável do tipo Pessoa
        scanf("%*c"); // remove o último ENTER do buffer do teclado
        printf("Nome: ");
        fgets(p.nome, 50, stdin); // lê o nome
        printf("Digite idade e sexo m ou f: ");
        scanf("%d %c", &p.idade, &p.sexo); // lê idade e sexo
        lista[quant] = p; // salva p no vetor
        quant++; // conta mais uma pessoa
        return 1; // retorno igual a 1 indica sucesso
    }
    else{
        printf("ERRO: vetor cheio.\n\n");
        return 0;
    }
}

Vamos agora fazer um procedimento para imprimir nosso vetor. Como ele é uma variável global não é necessário passa-lo como parâmetro. Perceba que imprimimos nosso vetor até quant e não até tam. Mesmo que nosso vetor tenha tamanho 10 isso não significa que sempre teremos 10 pessoas inseridas nele.

void imprimirVetor(){
    int i;
    for(i = 0; i < quant; i++){
        printf("Nome: %s", lista[i].nome);
        printf("Idade: %d\tSexo: %c\n\n", lista[i].idade, lista[i].sexo);
    }
}

Agora chegamos na parte divertida, salvar estes dados em um arquivo texto. A função fopen() recebe dois parâmetros, o nome do arquivo e um caracter que indica o modo como este arquivo deve ser aberto e retorna um endereço para o arquivo.

w -> do inglês write (escrever). Indica que o arquivo será aberto para escrita. Caso não seja encontrado nenhum arquivo com o nome indicado um novo arquivo será criado.

Na sequência, escrevemos no arquivo a quantidade de pessoas existentes no vetor (variável quant) e, com uma repetição, escrevemos todas as pessoas no arquivo.

void salvarEmArquivo(){
    FILE *arq = fopen("lista.txt", "w"); // abre / cria um arquivo para escrita
    int i;
    if(arq){ // verifica se o arquivo foi aberto / criado corretamente
        fprintf(arq, "%d\n", quant); // escreve no arquivo a quantidade de pessoas no vetor e salta uma linha
        for(i = 0; i < quant; i++){ // escreve as pessoas no vetor
            fprintf(arq, "%s", lista[i].nome); // escreve o nome
            fprintf(arq, "%d\n", lista[i].idade); // escreve a idade e salta uma linha
            fprintf(arq, "%c\n", lista[i].sexo); // escreve o sexo e salta uma linha
        }
        fclose(arq); // fecha o arquivo
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

Não esqueça de fechar o arquivo com fclose(), senão você terá um arquivo corrompido.

Agora que temos nosso arquivo salvo você pode abri-lo com um editor de texto simples como o bloco de notas para conferir o resultado, mas também podemos abri-lo via código, e ler seu conteúdo. É o que faremos agora.

Assim como fizemos para escrever, precisamos abrir nosso arquivo, mas agora não queremos escrever, mas ler. Indicamos isso trocando a letra w (write) por r (read).

void lerDoArquivo(){
    FILE *arq = fopen("lista.txt", "r"); // abre arquivo para leitura
    int i;
    if(arq){ // verifica se o arquivo foi aberto corretamente
        fscanf(arq, "%d\n", &quant); // lê a quantidade de pessoas existente no arquivo
        for(i = 0; i < quant; i++){
            Pessoa p; // cria uma variável do tipo pessoa
            fgets(p.nome, 50, arq); // lê um nome com tamanho máximo 50
            fscanf(arq, "%d\n", &p.idade); // lê a idade e uma quebra de linha
            fscanf(arq, "%c\n", &p.sexo); // lê o sexo e uma quebra de linha
            lista[i] = p; // insere no vetor
        }
        fclose(arq); // fecha o arquivo
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

Agora já temos tudo que precisamos para testar nosso programa com arquivo texto. Vamos criar nossa função principal, a função main com um menu de opções.

int main() {
    int op;

    do{
        printf("\n1 - Cadastrar\n2 - Imprimir\n3 - Salvar em arquivo texto\n4 - Ler do arquivo texto");
        printf("\n5 - Salvar em arquivo binario\n6 - Ler do arquivo binario\n0 - Sair\n");
        scanf("%d", &op);

        switch(op){
        case 0:
            printf("Tchau...\n\n");
            break;
        case 1:
            cadstrarPessoa();
            break;
        case 2:
            imprimirVetor();
            break;
        case 3:
            salvarEmArquivo();
            break;
        case 4:
            lerDoArquivo();
            break;
        case 5:
            salvarEmArquivo2();
            break;
        case 6:
            lerDoArquivo2();
            break;
        default:
            printf("Opcao invalida.\n\n");
        }

    }while(op != 0);

    return 0;
}

Código completo

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    char nome[50];
    int idade;
    char sexo;
}Pessoa;

int tam = 10;
Pessoa lista[10];
int quant = 0;

int cadstrarPessoa(){
    if(quant < tam){
        Pessoa p;
        scanf("%*c");
        printf("Nome: ");
        fgets(p.nome, 50, stdin);
        printf("Digite idade e sexo m ou f: ");
        scanf("%d %c", &p.idade, &p.sexo);
        lista[quant] = p;
        quant++;
        return 1;
    }
    else{
        printf("ERRO: vetor cheio.\n\n");
        return 0;
    }
}

void imprimirVetor(){
    int i;
    for(i = 0; i < quant; i++){
        printf("Nome: %s", lista[i].nome);
        printf("Idade: %d\tSexo: %c\n\n", lista[i].idade, lista[i].sexo);
    }
}

void salvarEmArquivo(){
    FILE *arq = fopen("lista.txt", "w");
    int i;
    if(arq){
        fprintf(arq, "%d\n", quant);
        for(i = 0; i < quant; i++){
            fprintf(arq, "%s", lista[i].nome);
            fprintf(arq, "%d\n", lista[i].idade);
            fprintf(arq, "%c\n", lista[i].sexo);
        }
        fclose(arq);
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

void lerDoArquivo(){
    FILE *arq = fopen("lista.txt", "r");
    int i;
    if(arq){
        fscanf(arq, "%d\n", &quant);
        for(i = 0; i < quant; i++){
            Pessoa p;
            fgets(p.nome, 50, arq);
            fscanf(arq, "%d\n", &p.idade);
            fscanf(arq, "%c\n", &p.sexo);
            lista[i] = p;
        }
        fclose(arq);
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

int main() {
    int op;

    do{
        printf("\n1 - Cadastrar\n2 - Imprimir\n3 - Salvar em arquivo texto\n4 - Ler do arquivo texto");
        printf("\n5 - Salvar em arquivo binario\n6 - Ler do arquivo binario\n0 - Sair\n");
        scanf("%d", &op);

        switch(op){
        case 0:
            printf("Tchau...\n\n");
            break;
        case 1:
            cadstrarPessoa();
            break;
        case 2:
            imprimirVetor();
            break;
        case 3:
            salvarEmArquivo();
            break;
        case 4:
            lerDoArquivo();
            break;
        case 5:
            salvarEmArquivo2();
            break;
        case 6:
            lerDoArquivo2();
            break;
        default:
            printf("Opcao invalida.\n\n");
        }

    }while(op != 0);

    return 0;
}

Na próxima aula veremos como trabalhar com arquivo binário. Não perca :).

Este post tem 3 comentários

  1. Claudio

    Não pausa para executar o arquivo. Uso o dev c++. Não funcionou o código.

  2. RENATA LEAL MARTINS

    Parabéns pela explicação. Perfeito.

Deixe um comentário

dezenove + 9 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.