#+title: Curso Básico da Linguagem C #+subtitle: Exercícios #+author: Blau Araujo #+startup: show2levels #+options: toc:3 * Exercícios da aula 15: Abertura de arquivos para escrita - [[../../aulas/15-wfiles/README.org][Anotações da aula]] - [[https://youtu.be/vL8vy3krcKc][Vídeo]] ** 1. Programa 'nf' (new file) No Unix e no GNU, é comum as pessoas associarem a criação de novos arquivos vazios ao utilitário =touch=, mas isso é só um efeito colateral de seu verdadeiro propósito, que é alterar a data/hora de último acesso ao arquivo. Sendo assim, crie um programa realmente dedicado a criar novos arquivos vazios. Uso proposto: #+begin_example nf ARQUIVOS... #+end_example Notas: - Os caminhos e nomes dos novos arquivos devem ser passados como argumentos. - Se nenhum argumento for passado, o programa terminará com erro, imprimindo suas informações de uso. - Se algum dos arquivos já existir, o programa não fará nada com ele e apenas exibirá uma mensagem em =stderr= com o seguinte formato: #+begin_example Arquivo NOME já existe: nada será feito! #+end_example - Para cada caminho inexistente, o programa deve exibir em =stderr=: #+begin_example O diretório DIR não existe: impossível criar ARQUIVO! #+end_example - Se algum arquivo não puder ser criado por falta de privilégios do usuário, a mensagem de erro deve ser: #+begin_example Impossível criar ARQUIVO: acesso negado! #+end_example - Mesmo que algum arquivo já exista, os demais devem ser criados normalmente. - Ao terminar, o programa deve exibir em =stdout= a quantidade de arquivos criados no seguinte formato: #+begin_example Arquivos criados: NUM_ARQUIVOS_CRIADOS de NUM_DE_ARQUIVOS_SOLICITADOS #+end_example ** 2. Programa 'hd' (here doc) No shell do Unix e do GNU, é possível criar novos arquivos digitando seus conteúdos com o mecanismo do /here doc/: #+begin_example :~$ cat << FIM >> ARQUIVO #+end_example Assim, o utilitário =cat= lê as linhas digitadas, imprime essas linhas e o shell as redireciona para /append/ em =ARQUIVO=. Portanto, crie um programa que reproduza este comportamento de forma autônoma, ou seja, sem operadores do shell. Uso proposto: #+begin_example hd ARQUIVO #+end_example Requisitos: - Apenas o primeiro argumento será aceito como o caminho e o nome do arquivo que receberá as linhas digitadas no terminal. - O programa deve avisar ao usuário se o arquivo já existir, dando a opção de continuar com o seguinte prompt: #+begin_example O arquivo ARQUIVO já existe, deseja modifícá-lo (s/N)? #+end_example - A opção padrão, aceita com =Enter=, é =N= (não). - Se o usuário aceitar continuar, as novas linhas devem ser escritas ao final do arquivo. - O programa vai parar de receber novas linhas quando o usuário teclar =Ctrl+D=. - Antes de terminar, o programa deve exibir o conteúdo atual do arquivo.