Beruflich Dokumente
Kultur Dokumente
Lista de exerccios 10
Assuntos novos: arquivos
Resumo e exemplos
Assuntos abordados:
Todas as funes para leitura e escrita de dados atravs da entrada padro (scanf, printf, gets, ...) podem ser
usadas no redirecionamento. Em especial, duas funes so bastante indicadas na leitura/escrita de caracteres:
getchar(): retorna um caractere da entrada padro, ou EOF (end of file) se achar o fim do arquivo.
putchar(c): envia o cactere c para a sada padro.
Comandos de redirecionamento e pipe do prompt do sistema operacional (EOF pode ser simulado pelo teclado
atravs de CTRL Z):
programa < dados1.txt > dados2.txt - executa programa recebendo como entrada
'dados1.txt' e gravando a sada em 'dados2.txt'
#include <stdio.h>
int main() {
char c;
while((c=getchar())!=EOF)
putchar(c);
return 0;
}
Testando o exemplo:
2) entre no path (pasta ou diretrio) que contm o arquivo executvel atravs do comando MD.
No prompt: c:\> MD \programas
3) execute o programa
No prompt: C:\programas\> exemplo1 < entrada.txt > sada.txt
Neste caso, o arquivo entrada.txt ser copiado para o arquivo sada.txt.
#include <stdio.h>
int main() {
int c;
while((c=getchar())!=EOF)
if(c != '\n' && c != '\r')
putchar(c);
return 0;
}
#include <stdio.h>
int main() {
int c;
while((c=getchar())!=EOF)
putchar(toupper(c));
return 0;
}
Principais funes:
Exemplo 1
#include <stdio.h>
#define MAX 200
int main() {
return 0;
}
Abre o arquivo "dados.txt", l e grava todos os nmeros inteiros para arquivo "dados2.txt" (faz uma cpia
de dados.txt para dados2.txt). Caso acuse erro na abertura, exibe mensagem de erro e encerra.
Ao trmino exibe a qtde de nmeros copiados.
Exemplo 3
Cria o arquivo "dados.txt" e o preenche com 1000 letras aleatrias.
Exerccios
1. Analise o programa abaixo e descreva o que faz. D uma aplicao para ele.
#include <stdio.h>
int main() {
int c;
long n = 1;
while((c=getchar())!=EOF)
if(c == '\n')
n++;
printf("%ld", n);
return 0;
}
2. Faa um programa para copiar a entrada padro para a sada padro, retirando todos os espaos em branco,
saltos de linha e tabulaes.
Exemplo de entrada:
#include <stdio.h>
int main() {
int c;
long n = 1;
// primeiro o caractere lido atribuido para c
// depois ele comparado com EOF
while((c=getchar())!=EOF)
if(c == '\n')
n++;
// a funo printf tambm envia para a sada padro
printf("%ld", n);
return 0;
}
A sada correspondente:
4. Desenvolva uma soluo, usando redirecionamento do SO, para retirar todos os comentrios de um programa
escrito em C.
Considere comentrios de linha (com //) e comentrios de mltiplas linhas (com /* e */).
5. Escreva um programa para criar o arquivo "multiplos7.txt" e gravar em seu contedo os nmeros mltiplos de
sete, um em cada linha. O limite ser determinado pelo usurio atravs de um argumento passado via linha de
comandos.
6. Elabore um programa para trocar os smbolos de pontuao de um texto por espaos em branco. O arquivo
original no dever ser modificado, o programa alterado dever ser colocado num arquivo de mesmo nome
acrescentando-se "_versao2" a direita do seu nome. A extenso dever ser mantida.
#include <stdio.h>
int main() {
int c;
long n = 1;
while((c=getchar())!=EOF)
if(c == '\n')
n++;
printf("%ld", n);
return 0;
}
// Conta linhas
#include <stdio.h>
int main() {
int c;
long n = 1;
while((c=getchar())!=EOF)
if(c == '\n')
n++;
printf("%ld", n);
return 0;
}
Observao: sequencias de caracteres entre aspas duplas, na linha de comandos, considerada como somente
um argumento.
8. Usando o pipe | atravs da linha de comandos, execute simultaneamente as solues dos problemas 3 e 7
para colocar comentrio de cabealho e tambm numeras as linhas de um programa em C.
#include <stdio.h>
int main() {
int c;
long n = 1;
while((c=getchar())!=EOF)
if(c == '\n')
n++;
printf("%ld", n);
return 0;
}
9. Elabore um programa para gerar o arquivo "nomesordenados.txt" contendo a lista de nomes entrada pelo
usurio. Use a entrada padro para fornecer os nomes, e a gravao direta no arquivo como sada. A entrada
encerrada quando for encontrado um nome vazio.
Alerta: a funo fputs(...)no pe automaticamente o salto de linha no final da string.
10. Desenvolva um programa para determinar a quantidade de cada uma das letras de um arquivo texto passado
como argumento da linha de comandos. No diferencie maiscula de minscula. Ao trmino exiba o ranking da
frequncia das letras, em ordem decrescente de quantidade.
11. Faa um programa gerar um arquivo texto, usando redirecionamento do SO, preenchido com nmeros
aleatrios.
Permita configuraes via argumentos da linha de comandos para determinar a quantidade de nmeros
sorteados, a faixa de nmeros sorteados, se sero ordenados (/o), se no ser aceita repetio de nmeros (/r), e
a disposio deles (/d): separados por n espao em branco (/dn), tabulao (/dt), salto de linha (/dl) ou outro
caractere qualquer (/d?), por exemplo, um hfen: (/d-)
Os valores default so: 10 nmeros sorteados, na faixa de 0 a 99, sem ordenao, aceita repetio, e 1 espao
como separador.
c:\aula> programa
20 34 12 76 32 98 99 65 55 10
c:\aula> programa 5
20 34 12 76 32
c:\aula> programa 5 50 80
50 75 80 50 65
c:\aula> programa 5 50 80 /o
50 50 65 75 80
12. Uma tcnica de criptografia chamada one-time pads binrios usa o operador XOR (em C, escreve-se ^) com
os caracteres da mensagem juntamente com os caracteres de uma senha, um a um. Ao trmino dos caracteres
da senha acontece um rodzio iniciando-se no primeiro novamente.
A vantagem deste operador que ele permite resgatar a mensagem original quando operado novamente pela
mesma senha (chave). Isto , suponha m a mensagem original e s a senha, ento m ^ s = c, onde c a
mensagem criptografada. Logo, se aplicarmos novamente a chave na mensagem criptografada, obteremos a
mensagem original, ou seja: c ^ s = m.
Faa um programa para receber, como argumentos da linha de comandos, o nome do arquivo origem, o nome do
arquivo destino e a senha. Suponha que a mensagem sempre maior que a senha.
Exemplo:
Ir recuperar o arquivo original como texto3.txt a partir do arquivo criptografado texto2.txt e da mesma
senha ze de oliveira.