Guia de Streams, Arquivos e Funções na Linguagem C
Classificado em Computação
Escrito em em
português com um tamanho de 6,83 KB
Streams
Streams: O sistema de arquivos de C é projetado para trabalhar com uma ampla variedade de dispositivos, incluindo terminais, acionadores de disco e fita. Embora cada um dos dispositivos seja muito diferente, o sistema de arquivos com buffer transforma-os em um dispositivo lógico chamado stream. Todas as streams se comportam de forma semelhante. Pelo fato de as streams serem amplamente independentes de dispositivo, a mesma função pode escrever em um arquivo de disco ou em algum outro dispositivo, como a tela. Existem dois tipos de stream: texto e binária.
E/S com Arquivo
E/S com Arquivo: A linguagem C não possui nenhum comando de E/S. Todas as operações de E/S ocorrem mediante chamadas a funções da biblioteca C padrão.
Streams e Arquivos:
Saída: char x = 'a'; FILE* f = stdout; putc(x, f);
Entrada: char x; FILE* f = stdin; x = getc(f);
Tipos de Streams e Arquivos
Streams Binárias: É uma sequência de bytes, sem tradução de caracteres.
Arquivos: Em C, um arquivo pode ser qualquer coisa, desde um arquivo de disco até um terminal ou impressora. Você associa uma stream com um arquivo específico realizando uma operação de abertura. Uma vez o arquivo aberto, informações podem ser trocadas entre ele e o seu programa. Nem todos os arquivos apresentam os mesmos recursos. Por exemplo, um arquivo em disco pode suportar acesso aleatório, enquanto um teclado não. Todas as streams são iguais, mas nem todos os arquivos.
Principais Funções de Manipulação
- Fopen: Abre um arquivo.
- Fclose: Fecha um arquivo.
- Putc/Fputc: Escreve um caractere em um arquivo.
- Getc/Fgetc: Lê um caractere de um arquivo.
- Fseek: Posiciona o arquivo em um ponto específico.
- Fprintf: Printf para arquivo.
- Fscanf: Scanf para arquivo.
- Feof: Devolve verdadeiro se for o fim do arquivo.
- Ferror: Devolve verdadeiro se ocorreu um erro.
- Rewind: Recoloca o indicador de posição no início.
- Remove: Apaga um arquivo.
- Fflush: Descarrega (flush) um arquivo.
O Ponteiro de Arquivo
O ponteiro de arquivo: É o meio comum que une o sistema de E/S. É um ponteiro para informações que definem várias coisas sobre o arquivo, incluindo seu nome, status e posição atual. Basicamente, o ponteiro de arquivo identifica um arquivo específico em disco e é usado pela stream associada para direcionar as funções de E/S. Um ponteiro de arquivo é uma variável ponteiro do tipo FILE. Para ler ou escrever arquivos, seu programa precisa usar um ponteiro de arquivo. Para obter uma variável ponteiro de arquivo, use um comando como: FILE *fp;
Arquivos de Registros e Streams Padrão
Arquivos de registros: Um arquivo de registro é uma coleção de registros mantida em disco. A grande vantagem no uso de arquivos é que, como eles são mantidos em disco, os dados armazenados neles não são perdidos quando o programa termina sua execução (diferentemente do que ocorre com vetores, que são mantidos na memória principal). A desvantagem é que o acesso ao disco é muito mais demorado do que o acesso à memória principal e, consequentemente, o uso de arquivos torna a execução do programa mais lenta.
As streams padrão: Sempre que um programa em C começa a execução, três streams são abertas automaticamente. Elas são a entrada padrão (stdin), a saída padrão (stdout) e a saída de erro padrão (stderr). Normalmente, essas streams referem-se ao console, mas podem ser redirecionadas pelo sistema operacional para algum outro dispositivo em ambientes que suportam redirecionamento de E/S. Exemplo: putchar(char c) { return putc(c, stdout); }
Variáveis e Escopo
Variáveis Globais e Locais
Variáveis globais: São declaradas da mesma forma que uma variável local — primeiro o tipo, depois o nome da variável. Mas a diferença é que esta variável é declarada fora de qualquer função. Variáveis globais podem ser utilizadas por qualquer função. E qualquer função pode alterar o valor, utilizá-la em um processo ou até mesmo atribuir o valor que quiser.
Variáveis locais: São aquelas nas quais apenas a função onde ela está declarada pode usá-la.
Parâmetros e Ponteiros
Passagem de Parâmetros
Passagem por valor: Como o próprio nome diz, uma expressão pode ser utilizada na chamada. O valor da expressão é calculado, e o valor resultante é passado para a execução da função.
Passagem por referência: O endereço de uma variável deve ser passado na chamada da função. Dessa forma, a função pode modificar a variável diretamente, o que em geral não é recomendado, mas há situações onde este recurso é necessário, por exemplo: criação de funções que devolvem imagem e valor.
Ponteiros
Ponteiro: É um tipo de variável que não contém um valor, mas um endereço. Cada linha da tabela de memória possui um endereço, e em cada endereço podemos armazenar um valor. Cada variável, ao ser criada, é associada a um endereço. Quando uma variável é utilizada em uma expressão do lado direito de uma atribuição, seu endereço é utilizado para buscar seu valor, e esse valor é utilizado para calcular o resultado da expressão. Quando uma variável é utilizada do lado esquerdo, seu endereço é utilizado para armazenar o resultado da expressão correspondente na memória. Assim, cada variável possui um endereço diferente e único, e os apontadores são variáveis capazes de manipular endereços.
Estrutura de Código
Sub-algoritmos e Funções
Sub-algoritmos: São blocos de instruções que realizam tarefas específicas. O código de um sub-algoritmo é carregado uma vez e pode ser executado quantas vezes for necessário.
Funções: É um bloco de código que visa atingir um objetivo específico em C. O seu objetivo pode ser cumprir uma ordem ou devolver uma resposta.
Recursividade e Procedimentos
Recursividade: É uma função que invoca ela mesma, ou seja, ela chama a si própria. É necessário cuidado para não cair em um loop infinito.
Procedimentos: Devem retornar um valor.