Arquivos
Exemplos de operações de entrada
- Leitura de um arquivo texto.
- Leitura de um arquivo binário
- Leitura de dados recebidos através de uma conexão de rede
- Leitura de dados recebidos através de uma porta serial
Exemplos de operações de saída
- Escrita de um arquivo texto
- Escrita de arquivo binários
- Envio de dados através de requisições HTTP
- Envio de dados através de portas seriais
Stream
- Stream são sequências de bytes
- No nível mais baixo de abstração, as operações de E/S são feitas em sequências de bytes
Arquivos em C
Para trabalhar com arquivos, a linguagem C oferece o tipo de dado FILE
da biblioteca <stdio.h>
.
Além disso do tipo FILE
, há várias funções para manipulações de arquivos, como por exemplo:
fopen
fclose
fprintf
fscanf
fgets
feof
Ao abrir uma arquivo em C com a função fopen
, é preciso especificar o modo de acesso (leitura, escrito ou ambos). Então para isso, existem alguns modos de acesso para o conteúdo do arquivo com tal função:
r
: abre o arquivo para leitura (read). O arquivo deve existir, caso contrário, ocorre uma falha de abertura do arquivo.w
: Abre o arquivo para escrita (write). Caso o arquivo já exista, todo o conteúdo é reescrito. Caso contrário, um novo arquivo é criado.a
: Abre o arquivo para escrita (append) e adiciona o novo conteúdo ao final do arquivo e mantém o conteúdo anterior do arquivo. Caso o arquivo não exista, um novo arquivo é criado.r+
: Abre o arquivo para leitura e escrita (read/update). O arquivo deve existir, caso contrário, ocorre uma falha de abertura do arquivo.w+
: Abre o arquivo para leitura e escrita (write/update). Caso o arquivo já exista, o conteúdo existe é reescrito. Caso contrário, um novo arquivo é criado.a+
: Abre o arquivo para leitura e escrita (append/update), mas adiciona o novo conteúdo ao final do arquivo e mantém o conteúdo anterior do arquivo. Caso o arquivo não exista, um novo arquivo é criado. Toda inserção move o cursor para o final do arquivo. Alterações da posição do cursor (comfseek()
) afeta apenas operações de leitura.b
: Indicar que o conteúdo do arquivo deve ser tratado em modo binário.wx
: indica escrita exclusiva (write exclusive): se o arquivo a ser aberto já existe,fopen()
retornaNULL
, evitando que o conteúdo original do arquivo seja apagado. Se não existe, um novo arquivo é criado.w+x
: abre um arquivo em modo leitura e escrita exclusiva. Após realizar as operações necessário no arquivo, é importante fechá-lo com a funçãofclose
. Caso não seja feita essa etapa, isso pode ocasionar em problemas, tais como:- Recursos criados para gerenciar arquivos não serão liberados;
- Buffers auxiliares para escrita em disco poderão não ser copiados;
- Acesso ao arquivo poderá ficar bloqueado, em outras palavras, outros processos não conseguirão acessar o arquivo.
CUIDADO: com early exits (
if (erro) return;
) no código.
Além dos modos de acesso, é fundamental compreender o funcionamento do posicionamento do cursos dentro do arquivo e para isso é utilizado a função fseek
em C que alterar a posição do cursor dentro de um arquivo.
int fseek(FILE *stream, long offset, int whence)
Parâmetros:
FILE *stream
: Este parâmetro indica o arquivo no qual desejamos modificar a posição do cursor.long offset
: Representa o deslocamento de offset posições que desejamos realizar.int whence
: Especifica a partir de onde o deslocamento deve ser realizado.SEEK_SET
: Significa que o deslocamento deve ser feito a partir do início do arquivo.SEEK_CUR
: Indica que o deslocamento será relativo à posição atual do cursor.SEEK_END
: Determina que o deslocamento deve partir do final do arquivo.
fseek(arquivo, 0, SEEK_SET);
Isso significa que estamos solicitando a alteração da posição do cursor no arquivo denominado “arquivo”. O deslocamento será de 0 posições a partir do início do arquivo (usando SEEK_SET
). Em outras palavras, estamos definindo que a nova posição do cursor dentro do arquivo será no byte zero, correspondendo ao início do arquivo.
A função ftell
pode ser útil ao trabalhar com o posicionamento do cursor, pois ela retorna a posição atual do cursor. Por exemplo, considere que o cursor está no final do arquivo, logo a função ftell
retorna o tamanho do arquivo em bytes, pois cada caractere (incluindo o \n
) indica uma posição.
Exemplo: modo leitura
#include <stdio.h>
int main() {
// Declarar um ponteiro para o arquivo
FILE *arquivo;
// Abrir o arquivo no modo de leitura ('r')
arquivo = fopen("exemplo.txt", "r");
// Verificar se o arquivo foi aberto com sucesso
if (arquivo == NULL) {
printf("Não foi possível abrir o arquivo.\n");
return 1; // Sair com erro
}
// Ler o conteúdo do arquivo e fazer algo com ele
char linha[100];
while (fgets(linha, sizeof(linha), arquivo) != NULL) {
printf("%s", linha);
}
// Fechar o arquivo após a leitura
fclose(arquivo);
return 0;
}
Saída:
Este é um exemplo de arquivo em C.
Você pode adicionar mais linhas aqui.
Exemplo: modo escrita
#include <stdio.h>
int main() {
// Declarar um ponteiro para o arquivo
FILE *arquivo;
// Abrir o arquivo no modo de escrita ('w')
arquivo = fopen("exemplo.txt", "w");
// Verificar se o arquivo foi aberto com sucesso
if (arquivo == NULL) {
printf("Não foi possível abrir o arquivo para escrita.\n");
return 1; // Sair com erro
}
// Escrever no arquivo
fprintf(arquivo, "Este é um exemplo de escrita em arquivo em C.\n");
fprintf(arquivo, "Você pode adicionar mais linhas aqui.\n");
// Fechar o arquivo após a escrita
fclose(arquivo);
printf("Escrita concluída com sucesso.\n");
return 0;
}
Saída:
Este é um exemplo de escrita em arquivo em C.
Você pode adicionar mais linhas aqui.
Exemplo: modo escrita exclusiva
#include <stdio.h>
int main() {
// Declarar um ponteiro para o arquivo
FILE *arquivo;
// Abrir o arquivo no modo de escrita exclusiva ('wx')
arquivo = fopen("exemplo.txt", "wx");
// Verificar se o arquivo foi aberto com sucesso
if (arquivo == NULL) {
printf("Não foi possível abrir o arquivo para escrita exclusiva.\n");
return 1; // Sair com erro
}
// Escrever no arquivo
fprintf(arquivo, "Este é um exemplo de escrita em arquivo em C com modo de escrita exclusiva.\n");
fprintf(arquivo, "Você pode adicionar mais linhas aqui.\n");
// Fechar o arquivo após a escrita
fclose(arquivo);
printf("Escrita concluída com sucesso.\n");
return 0;
}
Saída:
Este é um exemplo de escrita em arquivo em C com modo de escrita exclusiva.
Você pode adicionar mais linhas aqui.
Exemplo: modo de anexação
#include <stdio.h>
int main() {
// Declarar um ponteiro para o arquivo
FILE *arquivo;
// Abrir o arquivo no modo de anexação ('a')
arquivo = fopen("exemplo.txt", "a");
// Verificar se o arquivo foi aberto com sucesso
if (arquivo == NULL) {
printf("Não foi possível abrir o arquivo para anexação.\n");
return 1; // Sair com erro
}
// Escrever no arquivo
fprintf(arquivo, "Esta linha será anexada ao arquivo.\n");
fprintf(arquivo, "Você pode adicionar mais linhas aqui.\n");
// Fechar o arquivo após a anexação
fclose(arquivo);
// Abrir o arquivo no modo de leitura para exibir seu conteúdo
arquivo = fopen("exemplo.txt", "r");
// Verificar se o arquivo foi aberto com sucesso
if (arquivo == NULL) {
printf("Não foi possível abrir o arquivo para leitura.\n");
return 1; // Sair com erro
}
// Exibir o conteúdo do arquivo após a anexação
printf("Conteúdo do arquivo após a anexação:\n");
char linha[100];
while (fgets(linha, sizeof(linha), arquivo) != NULL) {
printf("%s", linha);
}
// Fechar o arquivo após a leitura
fclose(arquivo);
return 0;
}
Saída:
Conteúdo do arquivo após a anexação:
Conteúdo original do arquivo.
Esta linha será anexada ao arquivo.
Você pode adicionar mais linhas aqui.