Quando o arquivo é aberto, a posição corrente (mantida internamente pelo sistema) é o início do arquivo. A cada operação executada sobre o arquivo, essa posição é atualizada. O valor da posição corrente pode ser obtido pela função ftell. A função feof retorna um valor verdadeiro (inteiro diferente de 0) se a posição corrente para o arquivo indicado é o final do arquivo, ou falso (inteiro igual a 0) em caso contrário.
Na maior parte dos exemplos analisados neste texto, os arquivos estarão sendo manipulados de forma seqüencial. Assim, na leitura de um arquivo contendo texto, após a leitura de um caráter a posição corrente do arquivo estará indicando o próximo caráter; após a leitura de uma linha, a posição indicada será o início da próxima linha.
A rotina C para obter um caráter de um arquivo é fgetc:
int fgetc(FILE *stream);O valor de retorno de fgetc é um inteiro, que pode conter o código ASCII do caráter ou o valor EOF (definido em stdio.h), que indica o final do arquivo ou a ocorrência de alguma condição de erro.
Uma linha de um arquivo texto nada mais é do que uma seqüência de
caracteres seguido por um caráter terminador de linha
(newline). Tipicamente, o caráter terminador de linha adotado
é o CR (ASCII 0x0D), embora alguns sistemas operacionais
adotem o par CR/LF (o par de valores 0x0D e 0x0A) como
terminador de linha. A linguagem C traduz o terminador de linha para
o caráter '\n'
.
Para ler uma linha de um arquivo texto, a função da biblioteca padrão C fgets pode ser utilizada:
char *fgets(char *s, int size, FILE *stream);Essa função recebe três argumentos. O primeiro é o endereço de um arranjo de caracteres que irá receber a linha lida; esse arranjo deve ter capacidade para pelo menos size caracteres. O segundo é o número máximo de caracteres que deve ser lido da linha, caso a linha tenha mais caracteres que essa quantidade. O terceiro parâmetro é o manipulador do arquivo de onde a linha será lida. O retorno é um ponteiro para o início do arranjo com a linha, ou o ponteiro nulo caso o final do arquivo tenha sido atingido. Se houver espaço para o terminador de linha no arranjo, ele será incluído. Após o último caráter lido, a rotina inclui o terminador de string
'\0'
.
Operações correspondentes para a escrita em arquivos são oferecidas pela biblioteca padrão de C. Para escrever um caráter na posição corrente de um arquivo, a rotina fputc é usada:
int fputc(int c, FILE *stream);
Para escrever uma string, a rotina fputs pode ser utilizada:
int fputs(const char *s, FILE *stream);Neste caso, a string apontada por s (sem o terminador de string
'\0'
) é escrita no arquivo.
A função fseek permite modificar a posição corrente para um ponto arbitrário do arquivo, se tal operação for permitida. O primeiro argumento dessa função é o manipulador do arquivo; o segundo, um valor long indicando o deslocamento desejado; e o terceiro, um valor inteiro inidcando a referência para o deslocamento, que pode ser o início do arquivo (SEEK_SET), a posição corrente (SEEK_CUR) ou o final do arquivo (SEEK_END). Um valor de retorno 0 indica que a operação foi completada com sucesso. A função rewind retorna a posição corrente para o início do arquivo, sem valor de retorno.