Quando estamos trabalhando com arquivos, existe dois tipos de arquivos que devemos saber:

  1. Arquivo de texto
  2. Arquivo binário

1. Arquivo de texto

Um arquivo de texto é usado para armazenar dados textuais padrão e estruturados ou informações legíveis para humanos.

Eles requer um esforço mínimo pra manter e são fácil de ser lidos, mais ocupam um tamanho maior de armazenamento.

O arquivo de texto mais reconhecido é o padrão do Windows “.txt”. Outros exemplos são:

  • (Linguagem) .c
  • .Html
  • .css
  • .xml

2. Arquivo binário

Em vez de guardar os dados em texto simples, eles são guardados em formato de bits. São bastante similares a estruturas de matrizes, exceto as estruturas estão em um arquivo de disco em vez de em uma matriz na memória. Eles consegue manter uma quantidade maior de data e tem uma seguridade melhor do que arquivo de texto.

Operações de arquivos

Em c, voce consegue realizar quatro operações no arquivo, seja texto ou binário:

  1. Criar um novo arquivo
  2. Abrir um arquivo existente
  3. Fechar o arquivo
  4. Ler/Escrever

Trabalhando com arquivos

Para trabalhar com arquivos em c, voce precisa declarar um ponteiro do tipo FILE.

FILE *fptr;

Abrindo o arquivo - para criar e editar

A operação de abrir o arquivo é feito pela biblioteca “stdio.h” utilizado a função fopen(). A sintaxe é:

arq = fopen("nomearquivo","modo")

Por exemplo:

arq = fopen("E:\\cprogram\\newprogram.txt","w");

arq = fopen("E:\\cprogram\\oldprogram.bin","rb");

Modos de abrir o arquivo

Modo arquivo Significado existência do arquivo inexistência do arquivo
r Abrir para ler ✓ fopen() retorna NULL
w Abrir para escrever Os conteúdos são sobrescritos Vai criar um novo arquivo
a Abrir para acrescentar no fim do arquivo ✓ Vai criar um novo arquivo
r+ Abrir para ler e escrever ✓ Retorna NULL
w+ Abrir para escrever e ler Os conteúdos são sobrescritos Vai criar um novo arquivo
a+ Abrir para acrescentar e ler ✓ Vai criar um novo arquivo
rb Abrir para ler em binário ✓ Retorna NULL
wb Abrir para escrever em binário Os conteúdos são sobrescritos Vai criar um novo arquivo
ab Abrir para acrescentar no fim do arquivo em binário ✓ Vai criar um novo arquivo
rb+ Abrir para ler e escrever em binário ✓ Retorna NULL
wb+ Abrir para escrever e ler em binário Os conteúdos são sobrescritos Vai criar um novo arquivo
ab+ Abrir para acrescentar e ler em binário ✓ Vai criar um novo arquivo

Fechando o arquivo

O arquivo (Tanto do tipo texto como binário) deve ser fechado depois de ler/escrever.

A operação deve ser feita utilizado a função fclose(), da seguinte maneira:

fclose(arq);// arq é o que aponta para o arquivo.

Ler/Escrever em um arquivo binário

É utilizado as funções fread() e fwrite() para a leitura e escritura em um arquivo binário.

fread()

A função recebe 4 argumentos:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
  • ptr - Ponteiro para o registro a receber o dado lido.
  • size - Tamanho em bytes do registro.
  • nmemb - Numero de elementos a ser lidos.
  • stream - Ponteiro para um objeto FILE que especifica um fluxo de saída.

fwrite()

A função recebe 4 argumentos e bem parecida com a anterior:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
  • ptr - Ponteiro para o registro a ser escrito.
  • size - Tamanho em bytes do registro.
  • nmemb - Numero de elementos a ser lidos.
  • stream - Ponteiro para um objeto FILE que especifica um fluxo de saída.

Exemplo utilizando as duas funções

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>

//Crud
//Autor: Pedro Ésli
#define NOM_ARQUIVO "produtos.dat"
struct tProduto{
	int codigo;
	char descricao[100];
	float valor;
};

void incluir(struct tProduto *, char []);
void listar(char []);
int menu();
int main(){
	int opcao;
	struct tProduto produto;
	do{
		opcao = menu();
		switch(opcao){
			case 1:
				printf("--Incluir--\n\n");
				printf("Digite o codigo: ");
				scanf("%d",&(produto.codigo));
				printf("Digite a descricao: ");
				fflush(stdin);
				gets(produto.descricao);
				printf("Digite o valor: ");
				scanf("%f",&(produto.valor));

				incluir(&produto,NOM_ARQUIVO);
				break;
			case 2:
				printf("--Listar--\n\n");
				listar(NOM_ARQUIVO);
				break;
		}
	}while(opcao!=3);
}

void incluir(struct tProduto *produto, char nomeArquivo[]){
	FILE *arq = fopen(nomeArquivo,"ab");
	fwrite(produto,sizeof(struct tProduto),1,arq);
	fclose(arq);
}
void listar(char nomeArquivo[]){
	FILE *arq = fopen(nomeArquivo,"rb");
	struct tProduto produto;
	while(fread(&produto,sizeof(struct tProduto),1,arq))
		printf("%d - %s - %.2f\n",produto.codigo,produto.descricao,produto.valor);
	fclose(arq);
}
int menu(){
	int opcao;
	printf("\n(1)...Incluir\n");
	printf("(2)...Listar\n");
	printf("(3)...Sair\n");
	scanf("%d",&opcao);
	return opcao;
}

Bibliografia

The Basics of C Programming

C Programming Files I/O