Manipulando arquivos em C (parte 2)
Esta é a segunda parte de um tutorial que trata a manipulação de arquivos em C. Aqui veremos o funcionamento de funções como: fprintf, fscanf, fwrite, fread, fseek, etc.
Parte 3: Outras funções
Arquivos pré-definidos
Quando se começa a execução de um programa, o sistema automaticamente abre alguns arquivos pré-definidos:
- stdin: dispositivo de entrada padrão (geralmente o teclado);
- stdout: dispositivo de saída padrão (geralmente o vídeo);
- stderr: dispositivo de saída de erro padrão (geralmente o vídeo);
- stdaux: dispositivo de saída auxiliar (em muitos sistemas, associado à porta serial);
- stdprn: dispositivo de impressão padrão (em muitos sistemas, associado à porta paralela).
Cada uma destas constantes pode ser utilizada como um ponteiro para FILE, para acessar os periféricos associados a eles. Desta maneira, pode-se, por exemplo, usar:
c =getc(stdin);
para efetuar a leitura de um caracter a partir do teclado, ou:
putc(c, stdout);
para imprimí-lo na tela.
fgets
Lê uma string de um arquivo. A função lê a string até que um caracter de nova linha seja lido /n ou tamanho-1 caracteres tenham sido lidos. Se o caracter de nova linha for lido, ele fará parte da string, o que não acontecia com gets. A string resultante sempre terminará com /0 (por isto somente tamanho-1 caracteres, no máximo, serão lidos).
Protótipo: char *fgets (char *str, int tamanho, FILE *fp);
- Parâmetro 1 "char *str": a variável que receberá a string.
- Parâmetro 2 "int tamanho": o limite máximo de caracteres a serem lidos.
- Parâmetro 3 "FILE *fp": o arquivo que será lido.
fputs
Escreve uma string num arquivo.
Protótipo: char *fputs (char *str, FILE *fp);
- Parâmetro 1: "char *str" - a variável que contém os dados a serem escritos no arquivo.
- Parâmetro 2: "FILE *fp" - o arquivo a ser escrito.
fread
Leitura de bloco de dados.
Protótipo: unsigned fread (void *buffer, int numero_de_bytes, int count, FILE *fp);
- Parâmetro 1: "void *buffer" - variável na qual serão armazenados os dados lidos.
- Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser lido.
- Parâmetro 3: "int count" - indica quantas unidades devem ser lidas.
Parâmetro 4: "FILE *fp" - arquivo a ser lido.
fwrite
Leitura de bloco de dados.
Protótipo: unsigned fwrite (void *buffer, int numero_de_bytes, int count, FILE *fp);
- Parâmetro 1: "void *buffer" - variável na qual serão transmitidos os dados ao arquivo.
- Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser escrito.
- Parâmetro 3: "int count" - indica quantas unidades devem ser escritas.
- Parâmetro 4: "FILE *fp" - arquivo a ser escrito.
fseek
Procuras e acessos randômicos em arquivos. Esta move a posição corrente de leitura ou escrita no arquivo de um valor especificado, a partir de um ponto especificado.
Protótipo: int fseek (FILE *fp, long numbytes, int origem);
- Parâmetro 1: "FILE *fp" - arquivo a ser manipulado.
- Parâmetro 2: "long numbytes" - indica quantos bytes o cursor de posição do arquivo será movimentado apartir da sua posição atual.
- Parâmetro 3: "int origem" - indica apartir de onde os numbytes serão contados. Abaixo uma tabela com os possíveis valores:
| Nome | Valor | Significado |
| SEEK_SET | 0 | Início do arquivo |
| SEEK_CUR | 1 | Ponto corrente no arquivo |
| SEEK_END | 2 | Fim do arquivo |
rewind
Retorna a posição corrente do arquivo para o início.
Protótipo: void rewind (FILE *fp);
- Parâmetro: "FILE *fp" - arquivo a ser manipulado.
tenho uma coisa a acrescentar. Toda a saida/entrada é bufferizada no C, como podemos provar isso? Escreva um arquivo de nomes por exemplo:
Fulano de tal
Joaquim Pidim
Usi De Vi
Quando abrirmos o arquivo e recuperar o primeiro "Nome completo" usando: fscanf(fp, "%s", str); . Teremos como resultado "Fulano" e não Fulano de tal.Poderiamos deixar os nomes com tamanho de 30 espaços sendo apartir do ultimo sobrenome espaços, mas seria uma solução horrivel.
Mais facil é usar um atributo que permite agente dizer "onde" o C deve parar de ler, isso pode ser feito com esse: fscanf(fp,"%[^\n]s",str); . Isso irá trazer "de tal" para str. Em seguida, "Joaquim Pidim" e depois "Usi De Vi" sem complicação ou feitos revolucionarios :p
Bom espero ter sido claro, pois é um atributo incrivel não só pro fscanf mas em outras funções tb.
[]'s