Universidade Federal de Minas Gerais Instituto de Ciências Exatas Departamento de Ciência de Computação DCC003 -- Algoritmos e Estruturas de Dados 1 -- 2013/1 -- Turma F Prática 6 -- Manipulação de arquivos ############################################################################### INSTRUÇÕES: Salve suas soluções num arquivo .c (o nome está indicado entre parênteses no cabeçalho de cada exercício) e entregue no Moodle. IMPORTANTE: Coloque um comentário na primeira linha do arquivo contendo o(s) nome(s) do(s) aluno(s) que fizeram o código. (Um comentário em C é qualquer texto entre /* e */.) ############################################################################### DICAS: Para ler uma string de até 127 caracteres do teclado, use o seguinte código: char linha[128]; printf("digite uma linha:\n"); fgets(linha, 128, stdin); Para gerar um número aleatório em C entre 0 e RAND_MAX use a função rand() definida dentro de stdlib.h: #include /* no começo do arquivo */ int aleatorio = rand(); /* em qualquer ponto no programa */ Para alocar um vetor de X elementos do tipo Y use: Y * vetor = malloc(X * sizeof(Y)); /* Por exemplo: double * vetor = malloc(10 * sizeof(double)) */ /* Não esquecer de liberar a memória depois com free(vector)! */ Lembre-se que nomes de arranjos, quando usados sem colchetes, são convertidos em ponteiros. Além disso, temos que exp1[exp2] é semânticamente idêntico à *(exp1+exp2). Funções para manipulação de arquivos incluem: FILE * fopen(char *nome, char *modo); /* abrir um arquivo */ /* Use "r" para modo de leitura (read) e "w" para modo de escrita * (write). */ int fclose(FILE *arquivo); /* fechar um arquivo */ long ftell(FILE *arquivo); /* encontrar posição atual no arquivo */ int fseek(FILE *arquivo, long distancia, int base); /* mudar posição */ fprintf e fscanf, igual printf e fscanf mas aceitam arquivo como parâmetro. Exercício 1 -- Parâmetros na linha de comando (params.c) ###################### Escreva um programa para listar todos os parâmetros que ele recebeu da linha de comando. Declare sua função main com o cabeçalho completo: int main(int argc, char **argv); Onde argc é o número de parâmetros em argv, e argv[i] é o i-ésimo parâmetro da linha de comando. Para passar parâmetros para o seu programa da linha de comando, é só digitar texto na frente do executável. Por exemplo: C:\Users\Cunha\Desktop> gcc -Wall params.c -o params.exe C:\Users\Cunha\Desktop> exemplo.exe param1 param2 param_3 param 4 Exercício 2 -- Contando linhas (contalinhas.c) ################################ Escreva um programa para contar o número de linhas em um arquivo. Assuma que linhas estão separadas com caracteres '\n'. Seu programa deve receber o nome do arquivo para contagem de linhas no primeiro parâmetro da linha de comando (isto é, em argv[1]). Exercício 3 -- Descobrindo o tamanho de arquivos (tamanhoarq.c) ############### Escreva um programa que recebe o nome de um arquivo pela linha de comando e imprime o tamanho do arquivo em bytes. Dica: Use a função fseek para navegar para o final do arquivo e a função ftell para pegar a posição do último byte do arquivo. Exercício 4 -- Embaralhando arquivos (embaralha.c) ############################ Faça um programa que receba dois parâmetros da linha de comando. O primeiro parâmetro deve ser o nome de um arquivo texto. O segundo parâmetro deve ser o nome de um novo arquivo que será criado embaralhando as linhas do primeiro arquivo. Cada linha do primeiro arquivo deve ser impressa no segundo arquivo uma única vez, mas a ordem deve ser aleatória. DICAS: Abra o primeiro arquivo no modo leitura ("r") e o segundo arquivo no modo escrita ("w"). Para controlar quais linhas ainda precisam ser impressas, leia o primeiro arquivo e coloque suas linhas em um arranjo de string (char **linhas). Depois escolha uma linha aleatoria x para imprimir no segundo arquivo (imprima linhas[x]). Por último, marque a posição x de linhas como já impressa (por exemplo fazendo linhas[x] = NULL). Seja um gentleman ou uma lady e não esqueça de liberar memória com free.