Aula 5 - Programação de Softawre Basico

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 50

PROGRAMAÇÃO DE SOFTWARE

BÁSICO
ARA0363 – 1003
Prof: Maximiano Correia Martins, D.Sc

Aula 5
Plano de Aula: 5ª Aula de Programação de software básico

Entrada e saída por console e arquivo


Compreender o uso das funções de entrada e saída por console.
Compreender os parâmetros e códigos especiais das funções de
entrada e saída por console.
Desenvolver programas em C com entradas e saídas por console.
Entrada e saída em C
Quando Dennis Ritchie (1941-2011) desenvolveu a linguagem C, ele não quis dispensar uma
característica importante, a compacidade. Para obter uma linguagem compacta, ele
deliberadamente não forneceu tudo relacionado à saída e entrada na definição da
linguagem.
Assim, a linguagem C não contém nenhum código para receber dados do teclado e enviá-lo
na tela.
Então, como estamos usando as funções scanf() e printf() em C?
Dennis Ritchie usou as funções de entrada/saída do sistema operacional e as vinculou à
linguagem C.
Isso significa que a função printf() e a scanf() funcionarão de acordo com o SO que se está
usando. O programador não precisa se preocupar com o funcionamento dessas funções.
Funções de entrada/saída em C
Várias funções de entrada/saída estão disponíveis na linguagem C e podem ser
classificadas em duas grandes categorias:

• Funções de Entrada/Saída do Console - Essas funções recebem entrada


do teclado e as gravam no monitor de vídeo.

• Funções de entrada/saída de arquivos - Essas funções realizam operações


de entrada/saída em disco rígido ou pendrive.
Funções de Entrada/Saída (E/S) pelo Console em C

Teclado e tela juntos são chamados de console. Funções de E/S pelo


console podem ser classificadas em:

1)Funções de entrada/saída formatadas

2)Funções de entrada/saída não formatadas


Funções de entrada/saída formatadas em C

Vimos anteriormente as funções printf() e scanf(), da biblioteca stdio.h, que estão nessa categoria. Elas
fornecem a flexibilidade para receber a entrada em algum formato fixo e fornecer a saída no formato
desejado.
Função printf()
Essa função tem por finalidade imprimir dados na tela. Isto é feito através da sintaxe:
printf (“expressão de controle”, lista de argumentos);
Na “expressão de controle” são inseridos todos os caracteres a serem exibidos na tela e/ou códigos de
formatação, responsáveis por indicar o formato em que os argumentos devem ser impressos. Esses
argumentos devem estar incluídos na “lista de argumentos” e caso exista mais de um, devem ser
separados por vírgula.
Exemplo: printf("A resposta é %d\n", c);
onde c é uma variável do tipo inteiro.
Códigos de formatação permitidos na linguagem C
Os códigos especiais (barra invertida) são apresentados na tabela 2. Eles
também podem ser inseridos na “expressão de controle”.
A função printf()
Especificações de conversão causam a conversão e a impressão do argumento correspondente pela
função printf. Cada especificação de conversão começa com um símbolo % e termina com um
caractere de conversão.
Entre o % e o caractere de conversão, pode haver poucos números, sinais, pontos etc. Estes
ocorrem na seguinte ordem:
•Um sinal de menos, que especifica o ajuste à esquerda do argumento convertido.
•Um número que especifica a largura mínima do campo. Se necessário, será preenchido à esquerda
(ou à direita, se for necessário ajuste à esquerda) para compensar a largura do campo.
•Um período que separa a largura do campo da precisão.
•Um número, a precisão, que especifica o número máximo de caracteres a serem impressos a partir
de uma string ou o número de dígitos após o ponto decimal de um ponto flutuante.
Exemplos já vistos com a função “printf”
Exemplos:
int num = 12;
int num2 = 12345;
printf("%d\n", num2); // imprime 12345
printf("%5d\n", num); // imprime 12, com 3 espaços antes do número 12

float fnum = 0.9388;


printf("%.2f", fnum); // imprime 0.94
Função scanf ()
A função scanf permite que se aceite as entradas do padrão, que geralmente é o
teclado.
int a;
printf("Entre com valor inteiro: ");
scanf("%d", &a);

O programa lerá um valor inteiro que o usuário digitar no teclado (%d é para
números inteiros, como em printf, portanto a deve ser declarado como int) e
colocará esse valor em a.
Lembrando que se deve colocar & na frente da variável usada no scanf. Este
operador indica o endereço da variável.
NOVIDADE: Função sprintf() e sscanf ()
Essas funções de E/S formatadas funcionam um pouco diferentes das funções printf () e scanf ().
A função sprintf () é bastante semelhante à função printf(), mas em vez de imprimir a saída na tela,
ela é armazenada em um vetor de caracteres.
NOVIDADE: Função sprintf() e sscanf ()
A função sscanf() é o equivalente na função scanf(). Ela permite que o programador armazene os
caracteres de string em alguma outra variável.
Funções de entrada/saída não formatadas em C

Funções como getch(), getche() e getchar() estão nessa categoria. Essas


funções armazenam apenas um caractere.
Até agora usamos a função scanf() para armazenar valores, onde temos
que pressionar a tecla Enter para armazenar os valores na memória. Em
uma condição quando temos que armazenar apenas um caractere, as
funções não formatadas são úteis.
O arquivo de cabeçalho usado para essas três funções é conio.h.
Geralmente estas funções não estão disponíveis em ambiente Unix, pois
não fazem parte do padrão ANSI.
Função getch()
Esta função é usada para armazenar apenas um caractere na memória.
Ele não exibe esse caractere na tela durante a execução do programa.
Função getche()
Esta função funciona de maneira semelhante à função getch.
No entanto ela exibe esse caractere na tela.
Função getchar()
Esta função funciona totalmente semelhante à função getche. Ela
armazena um caractere e o exibe na tela. Mas temos que pressionar a
tecla Enter para armazenar um caractere enquanto estiver usando esta
função.
Exemplo:

Execute o programa e em seguida aperte três telas no teclado por fim Enter o que você observou???
Função putchar()

Exercício: Altere o código para imprimir de “A” ate “Z” e depois “a” ate “z” minúsculo.
Trabalhando com strings
Função gets()

A Função gets() Lê da entrada padrão (teclado) até encontrar uma nova linha (Enter) ou o fim de arquivo
(EOF). A nova linha não é incluída na string lida. O caractere NULL ('\0') é automaticamente adicionado ao
fim da string.

Essa função não é segura! Como não é possível especificar o número máximo de caracteres a serem lidos,
é possível ler caracteres além do tamanho da string passada como parâmetro, causando uma falha de
segurança conhecida como buffer overflow.

CUIDADO: Um buffer overflow (ou transbordamento de dados) acontece quando um programa excede o uso de memória assignado a ele pelo sistema
operacional, passando então a escrever no setor de memória contíguo. Essas falhas são utilizadas por cibercriminosos para executar códigos arbitrários
em um computador, o que possibilita muitas vezes aos atacantes controlar o PC
Função gets()
Função puts()
A função puts imprime na tela uma string especificada, incluindo uma
nova linha ('\n') ao final da impressão.
Função fgets()
A função fgets lê uma linha do fluxo especificado e a armazena na
string apontada por str.
Realiza o procedimento até que os caracteres (n-1) são lidos, o
caractere de nova linha é lido ou o final do arquivo é alcançado, o que
ocorrer primeiro.
É normalmente usada com arquivos. A leitura pelo teclado é feita com
stdin.
Sintaxe:
char * fgets (char * string, int tamanho, FILE * fluxo);
Exemplo: Função fgets()
Função fputs()
A função fputs escreve a cadeia de caracteres string no fluxo. Ela não tem a
mesma funcionalidade que a função puts. Além de ser possível especificar o
fluxo ao utilizar a fputs, ela não adiciona uma nova linha (\n) na saída.

Protótipo:
int fputs (const char * string, FILE * fluxo);

A função continua escrevendo até encontrar o indicador de fim da cadeia de


caracteres, o caractere NULL ('\0'). O NULL não é incluído no fluxo.
Exemplo:
Falaremos agora sobre sistemas de arquivos
• Sistema de arquivos, entrada e saída por arquivos.
• Leitura e escrita em arquivo de texto por exemplo usando comandos em C
• Vamos compreender o uso das funções de entrada e saída para arquivos.
• Por fim vamos poder desenvolver programas em C com entradas e saídas para
arquivos.
Padrão ANSI C
No início, C e o sistema operacional Unix estavam bem atrelados, pois cada
nova implementação de Unix para um tipo de máquina, requeria um novo
compilador C específico para essa máquina.
Nos anos 80 a linguagem C tornou-se popular também fora do ambiente
Unix. Nessa época surgiram novos compiladores comerciais de C e a
linguagem passou a ser reconhecida como linguagem de propósito geral.
Com o desenvolvimento de diversos compiladores tornou-se necessário
padronizar a linguagem a fim de garantir a compatibilidade e a portabilidade
da linguagem.
A ANSI – American National Standards Institute
A ANSI foi a entidade encarregada de realizar a padronização da linguagem.
Após a laboração do padrão este foi denominado de C ANSI.
Este padrão foi revisto diversas vezes ao longo do tempo e posteriormente foi também
reconhecido pela ISO, dando origem ao que chamamos de padrão ANSI/ISO C.
Durante os finais da década de 1970, a linguagem C começou a substituir a linguagem
BASIC como a linguagem de programação de microcomputadores mais usada.
Durante a década de 1980, foi adaptada para uso no PC IBM, e a sua popularidade
começou a aumentar significativamente. Ao mesmo tempo, Bjarne Stroustrup, juntamente
com outros nos laboratórios Bell, começou a trabalhar num projeto onde se adicionavam
extras para programação orientada por objectos à linguagem C.
A linguagem que eles produziram, chamada C++, é nos dias de hoje a linguagem de
programação de aplicações mais comum no sistema operacional Windows da companhia
Microsoft. A linguagem C continua sendo a mais popular no mundo Unix.
Sistemas de arquivos
O tratamento de informações, ou seja, o armazenamento e recuperação de informações em um
programa, muitas vezes se deparam com o problema de capacidade do processo em reter uma maior
quantidade de dados. Em algum momento também será preciso armazenar a informação para uso futuro,
de forma persistente, ou disponibilizar a informação para outra aplicação. Em todos esses casos, a
manipulação dessas unidades lógicas de informação, chamadas de arquivos, será necessária.
O gerenciamento de arquivos é feito pelo sistema operacional, que cria um mecanismo de
abstração para definir como estes são estruturados, nomeados, acessados, usados e protegidos em discos
rígidos, óticos, pendrives etc. Depois que salvarmos um arquivo em um determinado diretório (pasta),
informações como o início do cluster do arquivo, o tamanho do arquivo, a hora de criação e assim por
diante serão gravadas pelo sistema de arquivos. Quando fizermos algumas alterações neste arquivo, todas
as informações registradas serão atualizadas simultaneamente.
Sistemas de arquivos
O sistema de arquivos é gerado quando estamos criando partições e pode ser modificado
através do comando Formatar no Windows Explorer ou no utilitário de gerenciamento de
disco. E também podemos alterá-lo usando ferramentas de particionamento de terceiros.
Existem vários tipos de sistemas de arquivos, incluindo FAT12, FAT16, FAT32 e NTFS para
dispositivos no sistema operacional Windows; Ext2, Ext3 e Ext4 para dispositivos no Linux;
HFS / HFS + para mídia de armazenamento no Mac OS; ISO-9660, UDF (Universal Disc
Format) e CDFS (Compact Disc File System) para discos ópticos.
Se uma partição for formatada sem um sistema de arquivos ou o sistema de arquivos estiver
danificado, todos os arquivos salvos nessa partição ficarão inacessíveis para sistemas
operacionais que não sabem onde esses arquivos foram salvos.
Operações básicas com arquivos em C
Existem 4 operações básicas que podem ser executadas em qualquer arquivo na
linguagem C. Eles são:

• Abrir/Criar um arquivo (fopen)

• Fechar um arquivo (fclose)

• Ler um arquivo (fgets, fgetc)

• Escrever em um arquivo (putw, getw e rewind)


Função fopen()
É usada para abrir um arquivo para executar operações como leitura, escrita, etc. A função
fopen() cria um novo arquivo se o nome do arquivo mencionado não existir. Em um
programa C, declaramos um ponteiro de arquivo e usamos fopen() como abaixo:
FILE *fp;
fp=fopen (“nomearquivo”, ”modo”);
Onde fp – ponteiro de arquivo para o tipo de dado “FILE”,
“nomearquivo” é o nome do arquivo com caminho completo e “modo” se refere a
operação que será realizada no arquivo.
Com base no modo, o arquivo pode ser aberto para leitura ou gravação ou acréscimo
(append) dos textos.
Modo que o arquivo pode ser aberto para leitura ou gravação ou acréscimo (append) dos textos

r -=> Abre um arquivo no modo de leitura e define o ponteiro para o primeiro caractere no
arquivo. Retorna null se o arquivo não existir.
w => Abre ou cria um arquivo no modo de leitura e gravação. Retorna null se o arquivo não
puder ser aberto. Se o arquivo existir, os dados serão sobrescritos.
a => Abre um arquivo no modo de acréscimo. Ele retorna null se o arquivo não puder ser
aberto.
r + => Abre um arquivo para o modo de leitura e define o ponteiro para o primeiro caractere
no arquivo.
w + => abre um arquivo para o modo de leitura e gravação e define o ponteiro para o
primeiro caractere no arquivo.
a + => Abre um arquivo para o modo de leitura e gravação e define o ponteiro para o último
caractere no arquivo.
Função fclose():
A função fclose Fecha o arquivo que está sendo apontado e que foi aberto pela função fopen.

Qualquer dado que ainda não tenha sido escrito ao arquivo, é escrito antes de o arquivo ser
fechado.

int fclose (FILE * arquivo_aberto);

O próximo exemplo: Abrindo ou criando, escrevendo com fputs(), vista anteriormente, e fechando
um arquivo. Verifique que o arquivo foi criado e possui o texto digitado.
Exemplo: Abrindo, escrevendo e fechando um arquivo.
Função fgets()
A Função fgets() serve para ler de arquivo: é usada para ler um arquivo linha por linha. Usa-se
como mostrado abaixo:

fgets (buffer, tamanho, fp);

Onde: string – para guardar os dados de entrada.

tamanho – tamanho da string.

fp – ponteiro para o arquivo.

OBS: Lê do fluxo para a cadeia de caracteres string até a quantidade de caracteres


(tamanho - 1) ser lida ou até uma nova linha (\n) ou EOF ser encontrado. Após a
leitura, a posição atual do fluxo é avançada para o próximo caractere não lido.
Exemplo: Abrindo, lendo e fechando um arquivo.
Funções putw(), getw() e rewind()
putw => são usada para escrever um valor inteiro em um arquivo
getw => ler um valor inteiro a partir de um arquivo

A função rewind() é usada para mover a posição do ponteiro para o início do


arquivo.

Usa-se como abaixo:


putw(i, fp);
getw(fp);
rewind(fp);
onde, i é o valor inteiro e fp é o ponteiro para o arquivo.
Função fgetc()
A Função fgetc() Lê um caractere por vez do
arquivo. Usa-se desta forma:

fgetc(fp);
Onde: fp é o ponteiro para o arquivo.
Função fprintf

Essa função é igual à função printf (), mas grava dados formatados no arquivo em vez da saída padrão. Essa função possui os
mesmos parâmetros que printf (), mas possui um parâmetro adicional, que é um ponteiro do tipo FILE, que aponta para o arquivo
no qual a saída deve ser gravada. Retorna o número de caracteres emitidos para o arquivo em caso de sucesso e o EOF em erro.
PROTÓTIPO

int fprintf (FILE * fluxo, const char* formato, …);

PARÂMETROS

fluxo - ponteiro para um objeto FILE que será usado como saída. Além de arquivos, existem duas saídas padrões que podem ser
utilizadas:

Nome Descrição

stdout Saída padrão

stderr Saída padrão destinada a erros

formato - Parâmetro contendo a string de formato para o printf


FUNÇÃO fprintf
fprintf é uma função utilizada para imprimir cadeia de caracteres formatadas
em um fluxo.

#include <stdio.h>

int main() {
/* fprintf(stdout, ...) é equivalente a printf(...) */
fprintf(stdout, "Olá mundo!\n");

return 0;
}
Função fscanf()
A função fscanf() é usada para ler a entrada formatada do arquivo. Funciona exatamente como a
função scanf(), mas em vez de ler dados da entrada padrão, ele lê os dados do arquivo. De fato, a
maioria dos argumentos da função fscanf() é a mesma da função scanf(), exceto que ela só precisa
de um argumento adicional, obviamente o suficiente para apontar um arquivo. Em caso de êxito, essa
função retorna o número de valores lidos e, no erro ou no final do arquivo, retorna EOF ou -1.
Função fwrite()
Esta função é usada para gravar um bloco inteiro em um determinado arquivo, em geral um
arquivo binário. ptr é um ponteiro que aponta para o bloco de memória que contém as
informações a serem gravadas no arquivo, size denota o comprimento de um item em bytes, n é o
número de itens a serem gravados no arquivo e fptr é um ponteiro (FILE) que aponta para o
arquivo no qual os dados são gravados. Se for bem-sucedido, fwrite() escreverá n itens, isto é, n
* tamanho bytes no arquivo e retornará n. Em erro ou no final do arquivo, ele retornará um
número menor que n.

Sintaxe - fwrite(const void *ptr, size_t size, size_t n,FILE *fptr);


Função fread()
A função fread() é complementar à função fwrite(). A função fread() é comumente usada
para ler dados binários. Ela aceita os mesmos argumentos da função fwrite().

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

Buffer - Local de armazenamento de dados.

Size - Tamanho do item em bytes.

Count -Número máximo de itens a serem lidos.

Stream - Ponteiro para FILE a estrutura.


Exemplo de uso de fwrite() e fread():
Atividades Para Casa:
Refazer os exemplos desta aula.

Propor uma tarefa a ser executada com um programa feito em C que abre le e escreve em arquivo
txt ou binário.

Lista de alunos e suas notas salvando o nome a nota e media do aluno no arquivo NOTAS.txt
Atividades AURA c.
#include <stdio.h>
Atividade do objetivo 1:
#include <stdlib.h>
Escrever para console e arquivo na maneira que necessitamos é uma questão de int main()
usar a função correta, passando os parâmetros de forma adequada. Tente
reconhecer como os parâmetros abaixo formatam as saídas. {
float num;
b. FILE *fptr;
a. #include <stdio.h>
#include <stdio.h> fptr = fopen("programa.txt","w");
int main() if(fptr == NULL)
{ {
int main() printf("Erro ao abrir arquivo!");
printf( "<%f>\n", 1234.56 );
{ exit(1);
printf( "<%e>\n", 1234.56 );
printf( "<%d>\n", 123 ); }
printf( "<%4.2f>\n", 1234.56 ); printf("Entre com um numero fracionário: ");
printf( "<%2d>\n", 123 ); printf( "<%3.1f>\n", 1234.56 ); scanf("%f",&num);
printf( "<%10d>\n", 123 ); printf( "<%10.3f>\n", 1234.56 ); fprintf(fptr,"%.2f",num);
printf( "<%-10d>\n", 123); printf( "<%10.3e>\n", 1234.56 ); fclose(fptr);
return 0; return 0; return 0;
} }
}
Próxima Aula
Próximos passos
Na próxima aula iniciaremos o aprendizado de bibliotecas em C para
funções de entrada e saída em externas ao sistema computacional
usado.

A primeira será a porta serial do computador, muito útil para o


entendimento de algo essencial na programação de software básico, a
interface com diferentes hardwares e diferentes protocolos.
Vídeos Interessantes
• https://www.youtube.com/watch?v=ELQPwusHzrk

• https://www.youtube.com/watch?v=6h2ja9MzBkc

• https://www.youtube.com/watch?v=eriDnpkh5kA

• https://www.youtube.com/watch?v=7mKC07_lAg4

• https://www.youtube.com/watch?v=08LkxBAz4LU

Você também pode gostar