Sie sind auf Seite 1von 9

UFES CEUNES Cincia da Computao e Engenharia de Computao

Programao Estruturada 2 perodo 2013/1

Lista de exerccios 10
Assuntos novos: arquivos

Resumo e exemplos

Assuntos abordados:

Parte I: redirecionamento via linha de comandos: <, > e |


Parte II: funes de leitura e escrita em arquivos do tipo texto.

O trabalho com arquivos permite a persistncia de dados, isto , o armazenamento e a recuperao de


informaes em memria secundria (hard disk, HD externo, pendrive, DVD etc). Isto ode ser feito atravs do
redirecionamento da entrada padro (Parte I) ou na manipulao direta de arquivos atravs do descritor FILE da
Linguagem C (Parte II).

Parte I: redirecionamento da entrada padro via linha de comandos: <, > e |

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 > arquivo.txt


executa o programa enviando a sada padro para dentro de 'arquivo.txt'. Se j existir, sobrepe.

programa < arquivo.txt


executa o programa recebendo os dados do 'arquivo.txt' como entrada.

programa1 | programa2 - executa programa1 e programa2 simultaneamente, sendo que a sada


de programa1 direcionada para a entrada de programa2

programa1 < dados1.txt | programa2 > dados2.txt


executa programa1 e programa2 simultaneamente, sendo que a entrada de programa1 ser 'dados1.txt',
a sada de programa1 ser enviada para programa2, e a sada de programa2 ser colocada em dados2.txt

programa < dados1.txt > dados2.txt - executa programa recebendo como entrada
'dados1.txt' e gravando a sada em 'dados2.txt'

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 1 / 9


Os seguintes trs exemplos leem da entrada padro, fazem algum processamento e devolvem o resultado na
sada padro.

Exemplo 1: faz uma cpia.

#include <stdio.h>
int main() {
char c;
while((c=getchar())!=EOF)
putchar(c);
return 0;
}

Testando o exemplo:

1) abra a console de comandos

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.

Exemplo 2: retira os saltos de linha.

#include <stdio.h>
int main() {
int c;
while((c=getchar())!=EOF)
if(c != '\n' && c != '\r')
putchar(c);
return 0;
}

Exemplo 3: converte minsculas em maisculas.

#include <stdio.h>
int main() {
int c;
while((c=getchar())!=EOF)
putchar(toupper(c));
return 0;
}

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 2 / 9


Parte II: funes de leitura e escrita em arquivos do tipo texto

Principais funes:

fopen(): abre um arquivo


o prottipo: FILE* fopen(char* nome, char* tipo);
o o retorno um ponteiro que representa a estrutura do arquivo. Ele deve ser criado usando-
se o tipo FILE*. Se houver algum problema na abertura a funo retorna 0 (NULL).
o nome - uma string que contm o nome do arquivo que ser aberto
o tipo - uma string que contm o tipo da abertura. Entre os vrios tipos disponveis,
destaca-se "r" para abertura somente de leitura, e "w" para abertura somente de escrita (o
arquivo criado se no existe, ou sobrescrito se j existir).

close(arq): fecha o arquivo apontado por arq.

fprintf(arq,...): grava dados formatados para arq. Similar a printf.

fscanf(arq,...): l dados de arq. Similar a scanf.

fgets(string, qtde, arq): l uma linha inteira, considerando o mximo de qtde


caracteres, e coloca em string (char*), incluindo o nulo \0. Diferentemente da gets, ela
tambm armazena o salto de linha \n.

fputs(string,arq): escreve a string (char*) em arq. No pe salto de linha.

Exemplo 1

Cria o arquivo "dados.txt" e o preenche com 200 nmeros sorteados de 0 a 99.

#include <stdio.h>
#define MAX 200
int main() {

// declara o ponteiro fp (file pointer) para a estrutura FILE


FILE *fp;

// cria o arquivo dados.txt e o coloca no ponteiro fp


fp = fopen("dados.txt", "w");

// armazena MAX nmeros aleatrios dentro do arquivo apontado por fp


int i;
for(i=0; i < MAX; i++)
// escreve um nmero sorteado de 0 a 99 no arquivo
fprintf(fp,"%d ",rand()%100); // grava um nmero

// fecha o arquivo representado pelo ponteiro fp


fclose(fp);

return 0;
}

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 3 / 9


Exemplo 2

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.

// copia todos os nmeros de dados.txt para dados2.txt


#include <stdio.h>
int main() {
FILE *fp1, *fp2; // um file pointer para cada arquivo
fp1 = fopen("dados.txt", "r");
if(fp1 == 0) {
printf("Erro na abertura do arquivo dados.txt");
return 1;
}
fp2 = fopen("dados2.txt", "w");
if(fp2 == 0) {
printf("Erro na criao do arquivo dados2.txt");
return 1;
}
int qtde=0,x;
// fcanf retorna a qtde de elem. lidos, ou EOF se fim de arquivo
while(fscanf(fp1,"%d",&x) != EOF) {
fprintf(fp2, "%d ",x);
qtde++;
}
printf("%d numeros copiados", qtde);
fclose(fp1);
fclose(fp2);
return 0;
}

Exemplo 3
Cria o arquivo "dados.txt" e o preenche com 1000 letras aleatrias.

// cria o arquivo dados.txt e o preenche com mil letras maisculas


// aleatrias
#include <stdio.h>
int main() {
FILE *arquivo;
arquivo = fopen("dados.txt", "w");
if(arquivo == 0) {
printf("Erro na criao do arquivo dados.txt");
return 1;
}
int i;
char letra;
srand(time(NULL));
for(i=0; i < 1000; i++) {
letra = (rand()%26)+'A';
fprintf(arquivo,"%c",letra);
}
fclose(arquivo);
return 0;
}

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 4 / 9


Exemplo 4
uma verso mais flexvel do exemplo 4, pois permite ao usurio especificar o nome do arquivo e a
quantidade de letras na linha de comandos.

// cria um arquivo texto e o preenche com letras maisculas


// o nome do arquivo e a qtde de letras so passados via
// linha de comandos
#include <stdio.h>
int main(int argc, char *argv[]) {
FILE *arquivo;
if(argc != 3) {
printf("Arg. exigidos: nome_do_arquivo.txt qtde_letras");
return 1;
}
arquivo = fopen(argv[1], "w");
if(arquivo == 0) {
printf("Erro na criao do arquivo %s",argv[1]);
return 1;
}
int i;
char letra;
srand(time(NULL));
for(i=0; i < atoi(argv[2]); i++) {
letra = (rand()%26)+'A';
fprintf(arquivo,"%c",letra);
}
fclose(arquivo);
return 0;
}

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.

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 5 / 9


3. Elabore uma soluo, usando redirecionamento do SO, para colocar comentrios indicando o nmero das
linhas em programas escritos em C.

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:

/* 001 */ #include <stdio.h>


/* 002 */ int main() {
/* 003 */ int c;
/* 004 */ long n = 1;
/* 005 */ // primeiro o caractere lido atribuido para c
/* 006 */ // depois ele comparado com EOF
/* 007 */ while((c=getchar())!=EOF)
/* 008 */ if(c == '\n')
/* 009 */ n++;
/* 010 */ // a funo printf tambm envia para a sada padro
/* 011 */ printf("%ld", n);
/* 012 */ return 0;
/* 013 */ }

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.

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 6 / 9


7. Elabore uma soluo para inserir, num programa em C, uma linha de comentrio como um cabealho cuja
descrio especificada como argumento na linha de comandos.

Por exemplo, suponha o arquivo: teste.c

#include <stdio.h>
int main() {
int c;
long n = 1;
while((c=getchar())!=EOF)
if(c == '\n')
n++;
printf("%ld", n);
return 0;
}

Se a execuo via linha de comandos for:

C:\path> exercicio7 "Conta linhas" < teste.c > teste2.c

Ento o arquivo teste2.c dever conter:

// 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.

Por exemplo, suponha o arquivo: teste.c

#include <stdio.h>
int main() {
int c;
long n = 1;
while((c=getchar())!=EOF)
if(c == '\n')
n++;
printf("%ld", n);
return 0;
}

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 7 / 9


Se a execuo via linha de comandos for:

C:\path> exercicio8 "Conta linhas" < teste.c | exercicio7 > teste2.c

O arquivo teste2.c dever conter:

/* 001 */ // Conta linhas


/* 002 */ #include <stdio.h>
/* 003 */ int main() {
/* 004 */ int c;
/* 005 */ long n = 1;
/* 006 */ while((c=getchar())!=EOF)
/* 007 */ if(c == '\n')
/* 008 */ n++;
/* 009 */ printf("%ld", n);
/* 010 */ return 0;
/* 011 */ }

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.

Exemplos de chamada do programa:

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

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 8 / 9


c:\aula> programa 5 50 80 /o /r
50 65 75 80

c:\aula> programa 5 50 80 /d2


50 75 80 50 65

c:\aula> programa 5 50 80 /dl


50
75
80
50
65

c:\aula> programa 5 50 80 /d,


50,75,80,50,65

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:

c:\aula> exercicio12 texto1.txt texto2.txt "ze de oliveira"

Ir criar o arquivo texto2.txt criptografado a partir do arquivo texto1.txt e da senha ze de oliveira

Como segunda etapa, executa-se o seguinte comando:

c:\aula> exercicio12 texto2.txt texto3.txt "ze de oliveira"

Ir recuperar o arquivo original como texto3.txt a partir do arquivo criptografado texto2.txt e da mesma
senha ze de oliveira.

Lista de exerccios 10 Programao Estruturada 2013/1 pgina 9 / 9

Das könnte Ihnen auch gefallen