#+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/14-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.

