E/S em Arquivo A linguagem C não contém nenhum comando de E/S. O sistema de E/S de C provê um nível de abstração entre o programador e o dispositivo utilizado. Abstração stream Dispositivo real arquivo O sistema de arquivos de C trabalha com uma ampla variedade de dispositivos: terminais, acionadores de disco e acionadores de fita. As streams são amplamente independentes do dispositivo a mesma função pode escrever em um arquivo em disco ou em algum outro dispositivo (console). Se o arquivo suportar acesso aleatório, abrí-lo também inicializa o indicador de posição no arquivo para o começo do arquivo. Um arquivo é desassociado de uma stream específica por meio de uma operação de fechamento. Todos os arquivos são fechados automaticamente quando o programa termina normalmente. Cada stream associada a um arquivo tem uma estrutura de controle de arquivo do tipo FILE. Funções mais comuns do sistema de arquivo de C. Para ler ou escrever arquivos é preciso usar ponteiros de arquivo. Um ponteiro de arquivo é uma variável ponteiro do tipo FILE: A função fopen( ) abre uma stream para uso e associa um arquivo a ela. Seu protótipo é: FILE *fopen(const char* nomearq, const char* modo); Os valores legais para modo:
fp = fopen( test, w ); if(fp= fopen( test, w )) == NULL) { printf( arquivo não pode ser aberto\n ); exit(1); } A função fclose( ) fecha uma stream que foi aberta por meio de uma chamada a fopen( ). Seu protótipo é: int fclose(file *fp); A função putc( ) escreve caracteres em um arquivo que foi previamente aberto p/ escrita por meio da função fopen( ). O protótipo para essa função é: int putc(int ch, FILE *fp); A função getc( ) lê caracteres de um arquivo aberto no modo leitura por fopen( ). O protótipo de getc( ) é: int getc(file *fp); Ela devolve EOF quando o final do arquivo for alcançado. C inclui a função feof( ) que determina quando o final de arquivo foi atingido na leitura de dados binários. Seu protótipo é: int feof(file *fp);
A função rewind( ) reposiciona o indicador de posição de arquivo no início do arquivo especificado como seu argumento. Protótipo: void rewind(file *fp); A função remove(.) apaga o arquivo especificado. Seu protótipo: int remove(const char *filename); Para ler e escrever tipos de dados maiores que um byte: fread( ) e fwrite( ). Protótipos: size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp); size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);
Operações de leitura e escrita aleatória com a ajuda de fseek( ), que modifica o indicador de posição de arquivo. Protótipo: int fseek(file *fp, long numbytes, int origin); Origin Nome da Macro Início do arquivo SEEK_SET Posição atual SEEK_CUR Final do arquivo SEEK_END As funções fprintf( ) e fscanf( ) comportam-se exatamente como printf(.) e scanf(.) exceto por operarem com arquivos. Protótipos: int fprintf(file *fp, const char *control_string,...); int fscanf(file *fp, const char *control_string,...);
2 o ) Crie um arquivo-texto (registro.txt) inicialmente e armazene cinco registros pessoais (nome e idade separados por uma tabulação). Cada registro deve estar em linhas separadas. Faça um programa que leia o arquivo original (registro.txt) e crie dois arquivos (nome.txt e idade.txt) para armazenar os elementos dos três últimos registros (nome e idade) em separado. Armazene-os linha a linha também. Exercícios 1 o ) Faça um programa que copie o que você digita no prompt do DOS para um arquivo-texto criado para receber estes dados. O arquivo-texto terá que armazenar os dados linha a linha a cada execução do programa, sem perda de dados anteriores.