Você está na página 1de 21

05

Mestrado em Ciência da Computação


Estrutura de Dados

Arquivos

André Luis Schwerz


1
andreluis@utfpr.edu.br
Agenda
● Conceitos
● Funções da biblioteca <stdio.h>
○ Manipulação: fopen(), fclose(), feof()
○ Leitura: fgetc(), fgets() e fscanf()
○ Escrita: fputc(), fputs() e fprintf()
○ Acesso aleatório: fseek() e ftell()

● Exercícios Resolvidos

2
Conceitos

Arquivos
Um arquivo é uma coleção de itens que reside em disco.
Acesso pode ser não sequencial.
Acesso a informação pode ser concorrente.
Vantagem:
Os dados não são perdidos entre uma execução e outra.
Desvantagem:
O acesso ao disco é lento.

3
Conceitos

Tipos de Arquivos
Arquivos de Texto
- Cada byte do arquivo representa um caractere.
- Arquivos texto são fáceis de serem lidos por pessoas.
- Ocupa mais espaço para armazenar informações.
O inteiro 1.000.293 ocupa 7 bytes.

Arquivos Binários
- Os dados são gravados como estam na memória, byte a byte.
- Não conseguimos visualizar com um editor de texto
- É necessário um programa que reconheça aquela sequência de bytes e dê significado a ela.
- Ocupa menos espaço para armazenar informações
O inteiro 1.000.293 ocupa 4 bytes.
4
Arquivo Funções da biblioteca <stdio.h>

FILE* fopen(const char *filename, const char *mode) [referência]

Abre um arquivo em um determinado modo.


Exemplo:
Parâmetros #include <stdio.h>
<filename> - nome do arquivo #include <errno.h>
#include <string.h>
<mode> - modo de acesso ao arquivo int main(){
Retorno FILE* file = fopen ("arquivo.txt", "r");
Ponteiro FILE para o arquivo aberto if(file == NULL ) {
FILE* printf("Error number: %d\n", errno);
Endereço nulo (NULL) e uma variável printf("Msg: %s\n", strerror(errno ));
global errno é setada com o erro }
}

5
Arquivo Funções da biblioteca <stdio.h>

FILE* fopen(const char *filename, const char *mode) [referência]

Abre um arquivo em um determinado modo.


Modos:
Parâmetros r Abre o arquivo para leitura. O arquivo deve existir.

<filename> - nome do arquivo w Cria um arquivo vazio para gravação. Se já existir


<mode> - modo de acesso ao arquivo um arquivo com o mesmo nome, seu conteúdo será
apagado e o arquivo será considerado um novo
Retorno
Ponteiro FILE para o arquivo aberto arquivo vazio.
FILE*
Endereço nulo (NULL) e uma variável a Inclui dados no final de um arquivo já existente. O
global errno é setada com o erro arquivo é criado, se não existir.

r+ Abre um arquivo para leitura e escrita. O arquivo


deve existir.

w+ Cria um arquivo vazio para leitura e gravação.

a+ Abre um arquivo para leitura e inclusão de dados.


6
Arquivo Funções da biblioteca <stdio.h>

int fclose(FILE* file) [referência]

Fecha um arquivo informado.


Exemplo:
Parâmetros #include <stdio.h>
<file> - ponteiro para o arquivo a ser
int main(){
fechado. FILE* file = fopen ("arquivo.txt", "r");
Retorno printf("%d", fclose(file));
Zero }
int
EOF em caso de falha no fechamento

7
Arquivo Funções da biblioteca <stdio.h>

int fgetc(FILE* file) [referência]


Retorna o próximo caracter (unsigned int) do *file e
incrementa uma posição. Exemplo:
Parâmetros #include <stdio.h>
<file> - ponteiro para o arquivo a ser
int main(){
lido. FILE *file = fopen ("arquivo.txt", "r");
Retorno
Retorna o caracter lido. for (int i = 0; i < 5; i++){
int printf("%c", fgetc(file));
Final do arquivo alcançado. }
fclose(file);
}

8
Arquivo Funções da biblioteca <stdio.h>

char* fgets(char* str, int n, FILE* file) [referência]


Lê uma linha do arquivo especificado e a armazena na string apontada por str. A leitura para quando
● n-1 caracteres são lidos; ou
● o caractere de nova linha (\n) é lido; ou
● o final do arquivo é alcançado.
Exemplo:
Parâmetros #include <stdio.h>
<str> - ponteiro para string a ser lida. #include <string.h>
int main(){
<n> - número de caracteres a ser lido. FILE* file = fopen ("arquivo.txt", "r");
<file> - ponteiro para o arquivo a ser lido. char str[10];
Retorno if(fgets(str, 10, file) != NULL){
Retorna um string lido.
printf("%s\n", str);
char* printf("%d\n", strlen(str));
Um ponteiro NULL é retornado.
}
fclose(file);
}
9
Arquivo Funções da biblioteca <stdio.h>

int feof(FILE* file) [referência]

Verifica o indicador de indicador de fim de arquivo para um determinado arquivo.

Exemplo:
Parâmetros #include <stdio.h>
<file> - ponteiro para o arquivo a ser lido.
int main(){
FILE* file = fopen ("arquivo.txt", "r");
char c = fgetc(file);
while(feof(file)==0) {
Retorno printf("%c", c);
1, se alcançou o fim do arquivo
c = fgetc(file);
int }
0, caso contrário
fclose(file);
}

10
Arquivo Funções da biblioteca <stdio.h>

int fscanf(FILE* file, const char* format, ...) [referência]

Lê a entrada formatada de um arquivo.

Exemplo:
Parâmetros #include <stdio.h>
<file> - ponteiro para o arquivo a ser lido.
int main(){
<format> - especificador de formato. FILE* file = fopen ("arquivo.txt", "r");
char str1[10], str2[10], str3[10];
int ano;
Retorno fscanf(file, "%s %s %s %d", str1, str2, str3, &ano);
Número de itens lidos.
printf("String1 |%s|\n", str1 );
int printf("String2 |%s|\n", str2 );
Zero.
printf("String3 |%s|\n", str3 );
printf("Ano |%d|\n", ano );
fclose(file);
} 11
Arquivo Funções da biblioteca <stdio.h>

int fscanf(FILE* file, const char* format, ...) [referência]

Lê a entrada formatada de um arquivo.

Outro exemplo:
Parâmetros #include <stdio.h>
<file> - ponteiro para o arquivo a ser lido.
int main(){
<format> - especificador de formato. FILE* file = fopen ("arquivo.txt", "r");
int n, v[100];
fscanf(file, "%d", &n);
Retorno for(int i=0; i<n; i++){
Número de itens lidos.
fscanf(file, "%d", &v[i]);
int }
Zero.
fclose(file);
}

12
Arquivo Funções da biblioteca <stdio.h>

int fputc(int c, FILE *file) [referência]

Grava um caractere (unsigned char) especificado pelo argumento c no arquivo especificado e avança o
indicador de posição do arquivo.
Exemplo:
Parâmetros #include <stdio.h>
<c> - caractere a ser escrito.
int main(){
<file> - ponteiro para o arquivo a ser escrito. FILE* file = fopen ("arquivo.txt", "w");
//ABCDEFGHIJKLMNOPQRSTUVWXYZ
for(int ch = 65 ; ch <= 90; ch++ ) {
Retorno fputc(ch, file);
O caractere que foi escrito é retornado
}
int fclose(file);
EOF é retornado e o indicador de erro
é definido. }

13
Arquivo Funções da biblioteca <stdio.h>

int fputs(const char *str, FILE *file) [referência]

Escreve uma string apontada por str no arquivo especificado. Não inclui o caractere ‘\0’.

Exemplo:
Parâmetros #include <stdio.h>
<str> - ponteiro para string a ser escrita.
int main(){
<file> - ponteiro para o arquivo a ser escrito. FILE* file = fopen ("arquivo.txt", "w");

fputs("Estrutura de Dados", file);


Retorno fputs("Ciencia da Computacao", file);
Valor positivo.
int fclose(file);
EOF é retornado e o indicador de erro }
é definido.

14
Arquivo Funções da biblioteca <stdio.h>

int fprintf(FILE* file, const char* format, ...) [referência]


Escreve a saída formatada de um arquivo.

Exemplo:
Parâmetros #include <stdio.h>
<file> - ponteiro para o arquivo a ser escrito.
int main(){
<format> - especificador de formato. FILE* file = fopen ("arquivo.txt", "r");
fprintf(file, "%s %s %s %s %d", "Meu", "mestrado",
"iniciou","em", 2021);
Retorno fclose(file);
Número de caracteres escritos.
}
int
Valor negativo.

15
Arquivo Funções da biblioteca <stdio.h>

Exercício 1
Crie um programa para contar o número de espaços em branco em um arquivo passado como argumento.

#include <stdio.h>

int main(int argc, char **argv){


int white_spaces = 0;
char c;
// argv[1] é o primeiro argumento
FILE *file = fopen(argv[1], "r");
while (!feof(file)) {
c = fgetc(file);
if (c == ' ')
white_spaces++;
}
fclose(file);
printf("O arquivo possui %d espaços.\n", white_spaces);
return 0; 16
}
Arquivo Funções da biblioteca <stdio.h>

Exercício 2
Crie um programa para fazer cópias de arquivos texto, transferindo caracter por caracter. O programa deve
receber os nomes do arquivos de origem e destino via argumentos.

#include <stdio.h>

int main(int argc, char **argv){


char c;
FILE *source = fopen(argv[1], "r");
FILE *target = fopen(argv[2], "w");
c = fgetc(source);
while (!feof(source)) {
fputc(c, target);
c = fgetc(source);
}

fclose(source);
fclose(target); 17
return 0;
}
Arquivo Funções da biblioteca <stdio.h>

int fseek(FILE* file, long int offset, int whence) [referência]

Adiciona posição do arquivo o deslocamento (offset) fornecido.


Exemplo:
Parâmetros
#include <stdio.h>
<file> - arquivo a ser manipulado.
<offset> - deslocamento em bytes int main(){
<whence> - posição de onde o deslocamento FILE* file = fopen ("arquivo.txt", "w");
é adicionado.
fputs("Estrutura de Dados é chata!", file);
SEEK_SET - Início do arquivo fseek(file, 22, SEEK_SET);
SEEK_CUR - Posição atual fputs("maravilhosa!", file);
SEEK_END - Fim do arquivo
fclose(file);
Retorno return 0;
Zero }
int
Diferente de zero.
18
Arquivo Funções da biblioteca <stdio.h>

int fseek(FILE* file, long int offset, int whence) [referência]

Adiciona posição do arquivo o deslocamento (offset) fornecido.


Outro Exemplo:
Parâmetros
#include <stdio.h>
<file> - arquivo a ser manipulado.
<offset> - deslocamento em bytes int main(){
<whence> - posição de onde o deslocamento FILE* file = fopen ("arquivo.txt", "w");
é adicionado.
fputs("Estrutura de Dados é chata!", file);
SEEK_SET - Início do arquivo fseek(file, -6, SEEK_CUR);
SEEK_CUR - Posição atual fputs("maravilhosa!", file);
SEEK_END - Fim do arquivo
fclose(file);
Retorno return 0;
Zero }
int
Diferente de zero.
19
Arquivo Funções da biblioteca <stdio.h>

long int ftell(FILE* file) [referência]

Retorna a posição atual de um determinado arquivo.


Exemplo:
Parâmetros
#include <stdio.h>
<file> - arquivo a ser manipulado.
int main(){
Retorno FILE* file = fopen ("arquivo.txt", "w");
O valor atual do indicador de posição
long printf("%d\n", ftell(file)); // 0
int -1 e uma variável global errno é fputs("Estrutura de Dados é chata!", file);
printf("%d\n", ftell(file)); //28
setada com o erro
fseek(file, -6, SEEK_CUR);
printf("%d\n", ftell(file)); //22
fputs("maravilhosa!", file);
printf("%d\n", ftell(file)); //34

fclose(file);
return 0;
} 20
21

Você também pode gostar