Arquivos PDF

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 21

05

Mestrado em Ciência da Computação


Estrutura de Dados

Arquivos

André Luis Schwerz


1
[email protected]
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