Prof. Neucimar J. Leite. 3 de março de 2007

Documentos relacionados
Computação Eletrônica. Aula 12 Arquivos Texto e Binário. Prof: Luciano Barbosa. CIn.ufpe.br

Arquivos. Programação de Computadores I. Natália Batista.

Computação 2. Aula 8. Profª. Fabiany Arquivos

Aula 14 Oficina de Programação Tópicos Especiais em C: Arquivos. Profa. Elaine Faria UFU

Aula 16: Manipulação de Arquivos em C

13a. Aula Manipulação de arquivos

Arquivos em C Parte 2

Existe uma quantidade de informação que pode ser armazenada para resolver o problema.

Linguagem C. Armazenamento de Dados em Arquivos - Continuação

Estruturas de Dados. Módulo 15 - Arquivos. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Introdução a Programação. Manipulando Arquivos em Modo Texto

Arquivos em C. Material da Prof. Ana Eliza

Sequência de informações binárias armazenadas num dispositivo de armazenamento permanente. Em geral os bits são agrupados em grupos de 8 (1 byte)

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Arquivos em C

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:

Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

Métodos Computacionais. Arquivos

Departamento de Sistemas de Computação Universidade de São Paulo Introdução a Ciência de Computação I. Aula 13 Arquivos

USP - ICMC - SSC SSC o. Semestre Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Programação para Computação 13ª Aula

C Arquivos. Adriano Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Structs, Ponteiros e Arquivos. Prof. Maurício Dias

Laboratório de Introdução à Ciência da Computação I

Fundamentos de Programação 1

Programação de Computadores I Arquivos na Linguagem C PROFESSORA CINTIA CAETANO

Outline. 33. Manipulação de arquivos DIM

Programação de Computadores II

USP - ICMC - SSC SSC o. Semestre Disciplina de Introdução à Computação para Engenharia Ambiental

Manipulação de Arquivos

TÉCNICAS DE PROGRAMAÇÃO

LINGUAGEM C: ARQUIVOS

Manipulação de Arquivos

SSC INTRODUÇÃO À COMPUTAÇÃO PARA ENGENHARIA AMBIENTAL REGISTROS E ARQUIVOS. Profa. Dra. Milena Guessi Margarido

Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Automação ]

Programação II. Arquivos - Conceito. Arquivos

USP - ICMC - SSC SSC o. Semestre Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Automação ]

Aula: ARQUIVOS. Introdução à Ciência da Computação I Simone Senger Souza. ICMC/USP São Carlos

Faculdade de Computação

ARQUIVOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Computação 2. Aula 9. Diego Addan Arquivos

Algoritmos e Estruturas de Dados II IEC013

Fundamentos de Arquivos

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Listas (cont.) K&R: Capitulo 6. Lista Simplesmente Ligada IAED, 2012/2013. Conjunto de nós. Cada nó contém. head NULL. typedef struct node {

Manipulação de arquivos

1 Escrita de Arquivos Binário

Aula 26 - Arquivos. Prof. Laura Silva de Assis. Engenharia da Computação. CEFET/RJ - Centro Federal de Educação Tecnológica Celso Suckow da Fonseca

Manipulação de Arquivos Exercício/Exemplo:

Arquivos em C. Notas de Aula. Prof. Francisco Rapchan

Entrad Entrada / Saíd a / Saída

Leitura de Arquivos. Prof. Fabrício Olivetti de França

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Manipulação de arquivos

Introdução. Manipulação de arquivos em C. Estrutura de Dados II Prof Jairo Francisco de Souza

Alocação Dinâmica de Memória - Exercício

Linguagem C arquivos. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Linguagem de Programação C. Arquivos Binários

Linguagem C Ficheiros Compilação Separada

Manipulação de Arquivos

Aula 26: Arquivos de texto

Linguagem de Programação C. Arquivos

Alocação Dinâmica de Memória - Exercício Escreva um programa em C que manipule um vetor de inteiros não nulos alocado dinamicamente.

Introdução a Programação. Arquivos

1/24 FICHEIROS DE TEXTO

Programação Estruturada Prof. Rodrigo Hausen Entrada e Saída Parte 2

LINGUAGEM C: ARQUIVOS

E/S em Arquivo. Para ler ou escrever arquivos é preciso usar ponteiros de arquivo. Um ponteiro de arquivo é uma variável ponteiro do tipo FILE:

1/22 FICHEIROS BINÁRIOS

3.1 - Funções para manipular dados de entrada e saída padrão

Sumário. Ficheiros. Ficheiros

Manipulação de Ficheiros

Programação Estruturada

Arrays, Criação de Funções, Estruturas e Manipulação de Arquivos.

Linguagem C: Arquivo-Texto

CURSO BÁSICO DE PROGRAMAÇÃO AULA 17. Manipulação de arquivos binários.

DICA: Preste bastante atenção nas funções de manipulação de arquivos e verás que você já utiliza arquivos desde a primeira aula.

Arquivos Binários UFOP 1/25

Depuração e Teste de programas C C Depuração e teste de programas C

1 Arquivos em C. CEFETES Serra - Programação II Mateus Costa Notas de Aula - Arquivos

Programação. MEAer e LEE. Manipulação de ficheiros de texto. Bertinho Andrade da Costa. Instituto Superior Técnico. 2010/2011 1º Semestre

Comunicação Inter-Processo em Unix. Pipes FIFO (Named Pipes) Pipes

Manipulação de Arquivos

SSC304 Introdução à Programação Para Engenharias. Arquivos. GE4 Bio

Arquivos. Estruturas de Dados II Vanessa Braganholo

Ficheiros. IPC2 1999/2000 F. Nunes Ferreira

Aula de Arquivos. Jesimar da Silva Arantes. Instituto de Ciências Matemáticas e de Computação Universidade de São Paulo - São Carlos, SP

Acesso Aleatório em Arquivos

9. Arquivos em C. Prof. Renato Tinós. Departamento de Computação e Matemática (FFCLRP/USP) Introdução à Computação II

Comunicação entre Processos

Arquivos. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Fundamentos de Programação

Introdução à Computação II AULA 08 BCC Noturno - EMA896115B

MC-102 Aula 24 Arquivos em C e Parâmetros do Programa

Capítulo 6: Arquivos

Leandro C. Cintra M.C.F. de Oliveira Rosane Minghim PAE 2012: Rafael Martins. Fonte: Folk& Zoelick, File Structure

PROGRAMAÇÃO DE MICROPROCESSADORES 2007 / 2008

Operações em Arquivos. MC102 Felipe Bergo

Leitura Segura de Strings

Transcrição:

Funções para manipulação de arquivos Prof. Neucimar J. Leite 3 de março de 2007 Este resumo contém exemplos e comentários sobre algumas das principais funções da linguagem C para manipulação de arquivos de dados. 1 Funções de alto nível Estas funções de I/O são definidas no arquivo header stdio.h e não estão diretamente relacionadas ao sistema operacional. Elas manipulam arquivos de dados padrões que podem ser de dois tipos: formatados (dados formados por caracteres consecutivos que podem ser interpretados como dados individuais ou componentes de strings ou números), e não-formatados (dados organizados em blocos de bytes contíguos). Exemplo 1 Estrutura básica de um arquivo para gravação: FILE *fpt ; fpt = fopen("mc326.dat", "w") ;... fclose(fpt) ; FILE estabelece um buffer onde o conteúdo do arquivo de dados será armazenado no computador. fpt é o apontador para este buffer. fopen abre o arquivo de dados mc326.dat para escrita ( w ). Outras possibilidades são: Constante r w a r+ w+ a+ Significado abre um arquivo existente somente para leitura abre um novo arquivo somente para gravação. Apaga arquivo especificado caso o mesmo já exista abre um arquivo para adição de informações no final deste abre um arquivo existente para leitura e escrita abre um novo arquivo para leitura e escrita abre um arquivo existente tanto para leitura quanto para adição de informações no seu final. O arquivo será criado caso o mesmo não exista. 1

Exemplo 2 Acesso a arquivos com testes condicionais: #define NULL 0 FILE *fpt ; if((fpt = fopen("mc326.dat", "r")) == NULL) printf("\n Erro - O arquivo nao pode ser aberto \n") ; else {... fclose(fpt) ; No exemplo acima, uma mensagem de erro será emitida caso o arquivo mc326.dat, a ser aberto para leitura, não exista. 1.1 Leitura e escrita em arquivos de dados Um arquivo de dados deve ser criado antes de ser processado. Para tanto, pode-se, por exemplo, empregar um editor de texto ou implementar um programa que leia dados do teclado e grave-os no arquivo de dados sendo criado. Exemplo 3 Conversão de minúsculo para maiúsculo de uma linha de texto lida de um teclado (emprego das funções putc, getchar e toupper): #include <ctype.h> FILE *fpt ; char c ; fpt = fopen("mc326.dat", "w") ; /* ler os caracteres e converte-los gravando no arquivo de dados */ 2

printf("digite sequencia de caracteres e tecle ENTER:\n \n") ; do putc(toupper(c = getchar()), fpt) ; while (c!= \n ) ; fclose(fpt) ; Exemplo 4 Leitura de um arquivo de dados e exibição do mesmo na tela. (emprego das funções putchar e getc e da definição EOF). #define NULL 0 FILE *fpt ; char c ; if ((fpt = fopen("mc326.dat", "r")) == NULL) printf("\n O arquivo nao pode ser aberto \n") ; else do putchar(c= getc(fpt)) ; while(c!= EOF) ; fclose(fpt) ; Exemplo 5 Quando um programa é executado, o sistema operacional cria automaticamente ponteiros para três arquivos do ambiente. Este arquivos estão associados à entrada e saída padrões (nomeados stdin e stdout, correspondem, por exemplo, ao teclado e vídeo, respectivamente) e aos erros padrões (stderr). O programa a seguir mostra o conteúdo dos arquivos especificados em entrada. Na ausência de tal especificação, exibe os dados fornecidos a partir do teclado (uso de arquivos stdin e stdout). #include<stdio.h> /* mostra na tela conteudo de arquivos especidados na entrada */ 3

int main(int argc, char *argv[]) { FILE *fp ; void copia() ; if(argc == 1) copia(stdin, stdout) ; else while (--argc > 0) if((fp = fopen(*++argv, "r")) == NULL) { printf("cat: nao pode abrir arquivo %s\n", *argv) ; return 1 ; else { copia(fp, stdout) ; fclose(fp) ; return 0; /* mostra arquivo na tela */ void copia(file *in, FILE *tela) { int c ; while ((c = getc(in))!= EOF) putc(c,tela) ; Exemplo 6 Gravação e leitura de um arquivo de dados formatado contendo registros (uso das funções fprintf, fscanf e feof). #include <string.h> #define OK 1 typedef struct { int dia ; int mes ; int ano ; 4

data ; typedef struct { char nome[80] ; int num_conta ; data ultpag ; registro ; FILE *fpt ; int int flag = OK ; registro cliente ; registro le_tela(registro cliente) ; void mostra_tela(registro cliente) ; void grava_arq(registro cliente) ; void le_arq(registro cliente) ; fpt = fopen("dados.txt", "w") ; /* inicializar valores */ printf("\ndigite a data atual\n") ; scanf("%d%d%d", &cliente.ultpag.dia, &cliente.ultpag.mes, &cliente.ultpag.ano) ; while (flag) { /* ler dados do cliente */ cliente = le_tela(cliente) ; if (strcmpi(cliente.nome, "FIM") == 0) break ; /* gravar dados no arquivo dados.txt */ grava_arq(cliente) ; fclose(fpt) ; fpt = fopen("dados.txt", "r") ; /* ler primeiro registro */ fscanf(fpt, "%[^\n]", cliente.nome) ; fscanf(fpt, "%d", &cliente.num_conta) ; fscanf(fpt, "%d%d%d", &cliente.ultpag.dia, &cliente.ultpag.mes, &cliente.ultpag.ano) ; 5

while(!feof(fpt)) { /* le arquivo e exibe conteúdo na tela */ mostra_tela(cliente) ; fscanf(fpt, "%s", cliente.nome) ; fscanf(fpt, "%d", &cliente.num_conta) ; fscanf(fpt, "%d%d%d", &cliente.ultpag.dia, &cliente.ultpag.mes, &cliente.ultpag.ano) ; fclose(fpt) ; return 0 ; /*-------------------------------------------------------------------*/ void grava_arq(registro cliente) { fprintf(fpt, "%s\n", cliente.nome) ; fprintf(fpt, "%d\n", cliente.num_conta) ; fprintf(fpt, "%d %d %d\n", cliente.ultpag.dia, cliente.ultpag.mes, cliente.ultpag.ano) ; return ; /*-----------------------------------------------------------------*/ registro le_tela(registro cliente) { /* ler dados do cliente */ printf("nome (digite FIM para terminar): ") ; scanf(" %[^\n]", cliente.nome) ; if (strcmpi(cliente.nome, "FIM")!= 0) { printf("numero da Conta: ") ; scanf("%d", &cliente.num_conta) ; return(cliente) ; /*-----------------------------------------------------------------*/ void mostra_tela(registro cliente) { /* mostra conteudo do arquivo na tela */ printf("data: %d% d% d\n", cliente.ultpag.dia, cliente.ultpag.mes, cliente.ultpag.ano) ; printf("nome cliente: %s\n", cliente.nome) ; printf("conta: %d\n", cliente.num_conta) ; 6

Exemplo 7 Leitura de strings de determinado comprimento de um arquivo e gravação das mesmas em outro (emprego das funções fgets e fputs). #include<stdio.h> #include<string.h> #define MAX 20 FILE *fpt, *fpt1 ; char line[max] ; fpt = fopen("mc326.txt", "r") ; fpt1 = fopen("mc326r.txt", "w") ; while(fgets(line, MAX, fpt)!= NULL) /* fgets retorna NULL em caso de fim de arquivo */ fputs(line,fpt1) ; fclose(fpt) ; fclose(fpt1) ; Exemplo 8 Leitura de dados de um arquivo e exibição na tela. Ao final exibe o caractere do meio do conjunto lido (emprego das funções fseek e ftell). #include <fcntl.h> FILE *arq1 ; if((arq1 = fopen("mc326.txt", "r")) == NULL) printf("\nerro no acesso ao arquivo\n") ; else { putc(getc(arq1),stdout) ; /* le primeiro caractere */ while(!feof(arq1)) putc(getc(arq1),stdout) ; fseek(arq1, ftell(arq1)/2, SEEK_SET) ; /* posiciona ponteiro do arquivo no meio das posicoes percorridas e indicadas por 7

ftell; opcoes do fseek: SEEK_SET: a partir da posicao corrente SEEK_CUR: a partir da posicao atual SEEK_END: a partir do fim do arquivo */ printf("\n caractere do meio= %c\n", (char)getc(arq1)) ; fclose(arq1) ; 1.2 Arquivo de dados não-formatados As funções fread(...) e fwrite(...) ilustradas a seguir manipulam arquivos não-formatados, gerando arquivos binários quando do armazenamento de blocos de dados representando, por exemplo, uma estrutura complexa ou uma matriz. Ao invés de ler ou gravar os seus componentes individualmente, estas funções possibilitam a gravação ou leitura destes blocos de uma só vez. Exemplo 9 Gravação e leitura de um arquivo de dados não-formatado contendo registros. #include <string.h> #define OK 1 typedef struct { int dia ; int mes ; int ano ; data ; typedef struct { char nome[80] ; int num_conta ; data ultpag ; registro ; FILE *fpt ; int flag = OK ; registro cliente ; registro ler_tela(registro cliente) ; 8

void mostra_tela(registro cliente) ; fpt = fopen("dados.bin", "w") ; /* inicializar valores */ printf("\n digite a data atual \n") ; scanf("%d%d%d", &cliente.ultpag.dia, &cliente.ultpag.mes, &cliente.ultpag.ano) ; while (flag) { /* ler dados do cliente */ cliente = ler_tela(cliente) ; if (strcmp(cliente.nome, "FIM") == 0) break ; /* gravar dados no arquivo dados.bin */ fwrite( &cliente, sizeof(registro), 1, fpt) ; /* 1 indica transfer^encia de um único bloco de dados */ fclose(fpt) ; fpt = fopen("dados.bin", "r") ; fread(&cliente, sizeof(registro), 1, fpt) ; while(!feof(fpt)) { mostra_tela(cliente) ; fread(&cliente, sizeof(registro), 1, fpt) ; fclose(fpt) ; /*--------------------------------------------------------------*/ registro ler_tela(registro cliente) { /* ler dados do cliente */ printf("nome (digite FIM para terminar): ") ; scanf("%[^\n]", cliente.nome) ; if (strcmp(cliente.nome, "FIM")!= 0) { printf("numero da Conta: ") ; scanf("%d", cliente.num_conta) ; 9

return(cliente) ; /*---------------------------------------------------------------*/ void mostra_tela(registro cliente) { /* mostra conteúdo do arquivo binário na tela*/ printf("data: %d%d%d\n", cliente.ultpag.dia, cliente.ultpag.mes, cliente.ultpag.ano); printf("nome cliente: %s\n", cliente.nome) ; printf("conta: %d\n", cliente.num\_conta) ; 10

2 Funções de baixo nível As funções de baixo nível estão mais diretamente relacionadas ao sistema operacional empregado do que as de alto nível vistas anteriormente. 2.1 A função creat Esta função permite a criação de um novo arquivo binário. int creat(char *nome, int permissão) retorna um descritor de arquivo (um inteiro), se for possível a sua criação, e -1 em caso contrário. Um arquivo já existente aberto com esta função terá o seu conteúdo apagado. Para um novo arquivo, a permissão corresponde àqueles nove bits de proteção que controlam a permissão de leitura, gravação e execução para o dono do arquivo, grupo e para todos os outros usuários. Por exemplo, o número octal de três dígitos 0755 especifica permissão de leitura, gravação e execução para o dono, de leitura e execução para o grupo e para os demais usuários do sistema. No caso de um arquivo existente, o tratamento depende do seu parâmetro de permissão. Se existe permissão de gravação, então o arquivo é reinicializado com seu conteúdo original perdido. Em caso contrário, o arquivo permanece inalterado e a função retorna o valor -1. Exemplo 10 Criação de um arquivo com a função creat. main () { int arquivo ; if((arquivo = creat("exemplo.bin", 0644)) == -1) ; printf("\narquivo nao pode ser criado\n") ; else printf("\narquivo criado com sucesso\n") ; 2.2 A função open Esta função permite a abertura de um arquivo existente e é semelhante à função fopen, exceto que ao invés de retornar um apontador, ela retorna um descritor de arquivo na forma de um inteiro. int open(char *nom, int acesso) ; 11

nom é o nome do arquivo e acesso é o tipo da operação realizada. Algumas destas operações, representadas pelas constantes descritas no arquivo header FCNTL.H, são as seguintes: Constante O RDONLY O WRONLY O RDWR O APPEND O CREAT O TRUNC Tipo de acesso leitura gravação leitura e gravação gravação em fim de arquivo criação de um arquivo inexistente reinicialização do arquivo Os valores acima podem ser combinados através do operador. A função retorna o valor -1 caso o arquivo não possa ser aberto adequadamente. Uma outra forma de declaração da função open é a seguinte: int open(char *nom, int acesso, int permissão) ; em que permissão, como visto anteriormente, corresponde ao tipo de permissão atribuído a um arquivo a ser criado. Naturalmente, este parâmetro só é útil quando se deseja abrir um arquivo que não existe ainda (neste caso, o parâmetro acesso deve ser do tipo O CREAT). Exemplo 11 Criação de arquivos com a função open. #include <fcntl.h> main () { int arquivo1, arquivo2 ; arquivo1 = open("exemplo.bin", O_RDONLY) ; /* abrir o arquivo para leitura apenas ou criá-lo de acordo com o par^ametro permiss~ao */ arquivo2 = open("exemplo.txt", O_WRONLY O_CREAT, 0777) ;... close(arquivo1) ; 12

close(arquivo2) ; Como ilustrado acima, após o processamento de um arquivo, o mesmo deve ser fechado com a função: int close(int descritor arquivo) ; 2.3 Leitura de um arquivo: a função read Para as operações de I/O de baixo nível, um arquivo é constituído de uma seqüência de bytes. Sua leitura consiste, assim, do acesso a um número especificado destes bytes. A função read que carrega para a memória do computador o número de bytes do arquivo de dados é declarada como: int read(int descritor arquivo, void *buffer, unsigned numero bytes) ; buffer representa o endereço da área da memória que conterá os bytes lidos. numero bytes corresponde ao número destes bytes. Esta função retorna o número de bytes lidos efetivamente. Se este número for inferior a numero bytes, então o arquivo encontra-se no seu fim. O valor -1 é retornado em caso de problemas na abertura do arquivo. O ponteiro correspondente à posição atual no arquivo é atualizado a cada etapa de leitura, de acordo com o número de bytes lidos. 13

Exemplo 12 Leitura de blocos de bytes de um arquivo de dados. #include <fcntl.h> int arquivo1, tamanho ; char *buffer ; scanf("%d", &tamanho) ; if((arquivo1 = open("dados.bin", O_RDONLY))!= -1) { buffer = malloc(tamanho) ; read(arquivo1, buffer, tamanho) ; /*... */ else printf("\nproblemas na abertura do arquivo\n") ; close(arquivo1) ; 2.4 Gravação em um arquivo: a função write A função de gravação de baixo nível envia um certo número de bytes da memória do computador para um arquivo. Ela é especificada como: int write(int descritor arquivo, void *buffer, unsigned numero bytes) ; O valor retornado por esta função corresponde ao número de bytes efetivamente gravados no arquivo. O valor -1 é retornado em caso de problemas na gravação. Os bytes são escritos a partir da posição corrente que é atualizada de acordo com o número de bytes transferidos. Exemplo 13 Gravação de blocos de bytes em um arquivo #include <fcntl.h> int arquivo1, tamanho ; 14

char *buffer ; scanf("%d", &tamanho) ; if((arquivo1 = open("dados.bin", O_APPEND))!= -1) { buffer = malloc(tamanho) ; /*... */ write(arquivo1, buffer, tamanho) ; close(arquivo1) ; else printf("\nproblemas na abertura do arquivo\n") ; 15

Exemplo 14 Programa que copia o conteúdo de um arquivo em outro qualquer no disco. #include <fcntl.h> #define NULL 0 #define TAMBUF 512 #define MODOP 0644 main(argc, argv) int argc ; char *argv[] ; { int f1, f2, n ; char buf[tambuf] ; if(argc!= 3) printf("\nsintaxe: copiar de -- para\n") ; if((f1 = open(argv[1],0)) == -1) printf("\nerro: nao pode abrir\%s\n", argv[1]) ; if ((f2 = creat(argv[2], MODOP)) == -1) printf("\nerro: nao pode criar \%s\n", argv[2]) ; while ((n = read(f1, buf, TAMBUF)) > 0) if(write(f2,buf,n)!= n) printf("\nerro: erro de gravacao\n") ; 2.5 A função eof A função int eof(int descritor arquivo) ; permite verificar a ocorrência de um final de arquivo. O valor retornado é o seguinte: 1 se final de arquivo 0 em caso contrário -1 em caso de erro 16

2.6 Acesso direto: lseek As funções acima modificam automaticamente a posição corrente de leitura e gravação seqüenciais num arquivo de dados. Um acesso direto aos dados deste arquivo, sem leitura ou gravação, pode ser realizado pela função long lseek(int descritor numero, long numero bytes, int origem) ; numero bytes indica o deslocamento relativo em bytes e origem especifica a origem deste deslocamento. Esta constante pode assumir os seguintes valores: Constante SEEK SET ou 0 SEEK CUR ou 1 SEEK END ou 2 Deslocamento relativo a partir do início do arquivo a partir da posição atual a partir do final do arquivo O valor retornado por esta função é a nova posição atual que também pode ser determinada por long tell(int descritor numero) ; Exemplo 15 Emprego da função lseek #include <fcntl.h> int arq1, tamanho ; int nbytes = 256 ; int teste ; if((arq1 = open("dados.bin", O_RDWR)) == -1) printf("\nerro no acesso ao arquivo\n") ; else { teste = lseek(arq1, nbytes,seek_set) ; /* avanco de 256 bytes no arquivo */ 17

/* imprime teste = 256 e tell = 256 */ printf("\nteste = %d, tell = %d\n", teste, tell(arq1)) ; /*... */ close(arq1) ; 2.7 Supressão de um arquivo A função empregada para apagar um determinado arquivo de um diretório é a seguinte: int unlink(char *nom) ; Esta função retorna o valor 0, se devidamente executada, ou -1 em caso de erro. Exemplo 16 Supressão de um arquivo de dados. #include <stdio.h> char arquivo[30] ; puts("\ndigite arquivo a ser apagado\n"); gets(arquivo) ; if(unlink(arquivo)) puts("\nproblemas!!!\n"); else puts("\narquivo apagado\n") ; 18