7 O objetivo no uso de buferização pela biblioteca de I/O padrão é minimizar as
8 chamadas para read()/write(). Além disso, a biblioteca manipula a buferização
9 automaticamente, tentado obter o melhor valor do buffer para read() e write().
11 Existem três tipos de bufferização:
13 1. fully-buffered ou block-buffered: a I/O acontece quando o buffer está cheio,
14 ou quando fflush() é chamada;
16 2. line-buffered: a I/O acontece quando um caracter de nova-linha é encontrado
17 em uma input ou ouput, ou quando o buffer está cheio, ou quando fflush() é
18 chamada ou quando entrada é requisitada através da biblioteca de I/O padrão
19 para uma stream não bufferizada ou line-buffered stream (no último caso o
20 flush acontece porque o dado já pode estar disponível)
22 3. unbuffered: a lib não faz bufferização.
25 ----> stdout: line-buffered
26 ----> stderr: unbuffered
27 ----> normal files: fully-buffered
29 Todas as setagems podem ser alteredas com a função setvbuf().
32 Lendo e escrevendo uma stream (fluxo)
33 -------------------------------------
38 There are three types:
40 1. Character-at-a-time I/O
41 --------------------------
46 getc(), fgetc(), getchar()
48 a diferença entre getc() e fgetc() é getc() pode ser implementada como uma macro
49 e fgetc() sempre vai ser uma função. Isso significa que podemos pegar o endereço
50 de fgetc(), e não podemos usar getc() com side-effects. E também getc() é feita
53 para destinguir erros (pois essas funções também retornam EOF em caso de erro)
54 use: ferror() ou feof() e também clearerr()
59 putc(), fputc(), putchar()
79 Tomar cuidado quando estiver utilizando essas funções para estruturas,
80 pois compiladores diferentes podem organizar as estruturas de maneira