É 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 :).
Não pausa para executar o arquivo. Uso o dev c++. Não funcionou o código.
Parabéns pela explicação. Perfeito.
Olá Renata. Obrigado pelo feedback 🙂
Tem também a parte II falando sobre arquivo binário aqui (https://wagnergaspar.com/arquivo-binario-com-a-linguagem-de-programacao-c/) você viu?