Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
pua:operacoes_usando_streams [2008/08/13 22:35] – maziero | pua:operacoes_usando_streams [2016/03/22 13:49] (atual) – [Saída formatada] maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Operações usando streams ====== | ||
+ | |||
+ | Aqui serão descritas algumas das funções mais usuais para operações de entrada/ | ||
+ | |||
+ | ===== Abrindo e fechando streams ===== | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | FILE * fopen (const char *filename, const char *opentype) | ||
+ | </ | ||
+ | |||
+ | Abre um arquivo indicado por '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | FILE * fdopen (int filedes, const char *opentype) | ||
+ | </ | ||
+ | |||
+ | Cria um novo //stream// usando o descritor de arquivo '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | FILE * freopen (const char *filename, const char *opentype, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Fecha e abre novamente um //stream//, permitindo alterar o arquivo e/ou modo de abertura. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fclose (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Fecha um //stream//. Dados de saída em buffer são escritos, enquanto dados de entrada são descartados. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fcloseall (void) | ||
+ | </ | ||
+ | |||
+ | Fecha todos os //streams// abertos, de forma similar a '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | FILE * fdopen (int filedes, const char *opentype) | ||
+ | </ | ||
+ | |||
+ | Cria um novo //stream// usando o descritor de arquivo '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fileno (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Retorna o descritor de arquivo associado ao //stream// indicado. | ||
+ | |||
+ | Exemplo: abrindo o arquivo '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | int main (int argc, char *argv[]) | ||
+ | { | ||
+ | FILE *arq ; | ||
+ | | ||
+ | arq = fopen (" | ||
+ | | ||
+ | if ( ! arq ) | ||
+ | { | ||
+ | perror ("Erro ao abrir arquivo x") ; | ||
+ | exit (1) ; | ||
+ | } | ||
+ | | ||
+ | | ||
+ | exit (0) ; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Exemplo: abre o arquivo '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | int main (int argc, char *argv[]) | ||
+ | { | ||
+ | FILE *arq ; | ||
+ | |||
+ | arq = fopen (" | ||
+ | |||
+ | if ( ! arq ) | ||
+ | { | ||
+ | perror ("Erro ao abrir/criar arquivo x") ; | ||
+ | exit (1) ; | ||
+ | } | ||
+ | |||
+ | | ||
+ | exit (0) ; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Saída simples ===== | ||
+ | |||
+ | Estas funções permitem gravar caracteres ou strings simples em streams. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fputc (int c, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Converte o inteiro '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int putc (int c, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Equivalente a '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int putchar (int c) | ||
+ | </ | ||
+ | |||
+ | Equivale a '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fputs (const char *s, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Escreve a string '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int puts (const char *s) | ||
+ | </ | ||
+ | |||
+ | Escreve a string '' | ||
+ | |||
+ | ===== Entrada de caracteres ===== | ||
+ | |||
+ | Estas funções permitem ler caracteres isolados de um stream. O valor lido é um '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fgetc (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Lê o próximo caractere do stream indicado. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int getc (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Idem, mas implementado como macro (mais rápido). | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int getchar (void) | ||
+ | </ | ||
+ | |||
+ | Idem, sobre o stream padrão '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int ungetc (int c, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Coloca um caractere de volta no buffer de entrada do stream indicado (o arquivo não é alterado). Útil em programas de // | ||
+ | |||
+ | ===== Entrada de linhas ===== | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | char * gets (char *s) | ||
+ | </ | ||
+ | |||
+ | Lê caracteres de '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | char * fgets (char *s, int count, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Lê uma linha de caracteres do stream e a deposita na string '' | ||
+ | |||
+ | Observação: | ||
+ | |||
+ | ===== Entrada/ | ||
+ | |||
+ | A funções a seguir permitem ler/ | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | size_t fread (void *data, size_t size, size_t count, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Lê até '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | size_t fwrite (const void *data, size_t size, size_t count, FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Escreve até '' | ||
+ | |||
+ | ===== Saída formatada ===== | ||
+ | |||
+ | As operações de entrada e saída formatada usam padrões para formatação dos diversos tipos de dados descritos em livros de programação em C e no manual da GLibC. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int printf (const char *template, ...) | ||
+ | </ | ||
+ | |||
+ | Escreve dados usando a formatação definida em '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fprintf (FILE *stream, const char *template, ...) | ||
+ | </ | ||
+ | |||
+ | Idêntico a '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int sprintf (char *s, const char *template, ...) | ||
+ | </ | ||
+ | |||
+ | Similar a '' | ||
+ | |||
+ | ===== Entrada formatada ===== | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int scanf (const char *template, ...) | ||
+ | </ | ||
+ | |||
+ | Lê dados do stream '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fscanf (FILE *stream, const char *template, ...) | ||
+ | </ | ||
+ | |||
+ | Similar a '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int sscanf (const char *s, const char *template, ...) | ||
+ | </ | ||
+ | |||
+ | Similar a '' | ||
+ | |||
+ | ===== Posicionamento ===== | ||
+ | |||
+ | Estas funções permitem conhecer/ | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | long int ftell (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Retorna a posição corrente de leitura/ | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fseek (FILE *stream, long int offset, int whence) | ||
+ | </ | ||
+ | |||
+ | Ajusta posição do ponteiro no stream indicado. O ajuste é definido por '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | void rewind (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Reposiciona o ponteiro no início (posição 0) do stream indicado. | ||
+ | |||
+ | ===== Controle de travas ===== | ||
+ | |||
+ | Todos os acessos a um stream são efetuados de forma atômica, com sincronização através de uma trava implícita (automática). Todavia, algumas funções são providas para controlar explicitamente a trava associada a um stream, caso isso seja necessário. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | void flockfile (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Obtém a trava associada ao stream. O processo ou thread fica bloqueado até obter a trava. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int ftrylockfile (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Tenta obter a trava associada ao stream. Retorna imediatamente, | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | void funlockfile (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Libera a trava obtida explicitamente com '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | int __fsetlocking (FILE *stream, int type) | ||
+ | </ | ||
+ | |||
+ | Permite alterar a forma de travamento do stream. Os valores possíveis para type são: '' | ||
+ | |||
+ | ===== Erros e fim de stream ===== | ||
+ | |||
+ | <code c> | ||
+ | int EOF | ||
+ | </ | ||
+ | |||
+ | Macro com valor retornado por algumas funções, para indicar fim do arquivo ou erro. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int feof (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Retorna valor não nulo se o stream chegou ao seu fim. Ver também '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int ferror (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Retorna um valor não nulo se ocorreu um erro em algum acesso anterior ao stream. Ver também '' | ||
+ | |||
+ | Além de ajustar o indicador de erro do stream, as funções de acesso a streams também ajustam a variável '' | ||
+ | |||
+ | ===== Controle de buffers ===== | ||
+ | |||
+ | A descarga (// | ||
+ | |||
+ | * Quando o buffer está cheio. | ||
+ | * Quando o stream é fechado. | ||
+ | * Quando o programa termina (fim de '' | ||
+ | * Quando um //newline// é escrito em um stream com buffer de linha. | ||
+ | * Quando ocorre uma leitura de dados do arquivo associado ao stream. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fflush (FILE *stream) | ||
+ | </ | ||
+ | |||
+ | Descarrega o buffer do stream indicado, ou de todos os streams abertos, caso '' | ||
+ | |||
+ | Após abrir um stream (mas antes de usá-lo), é possivel definir sua política de buffer. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int setvbuf (FILE *stream, char *buf, int mode, size_t size) | ||
+ | </ | ||
+ | |||
+ | Especifica a política de buffer a ser usada no stream indicado. O valor mode pode ser '' | ||
+ | |||
+ | <code c> | ||
+ | int BUFSIZ | ||
+ | </ | ||
+ | |||
+ | Macro que indica o tamanho mais adequado de buffer para o sistema. Depende de vários parâmetros do sistema, mas seu valor mínimo é 256. | ||