https://wiki.sj.ifsc.edu.br/index.php?title=PRG122804_2017_2_AULA14&feed=atom&action=historyPRG122804 2017 2 AULA14 - Histórico de revisão2024-03-29T10:40:59ZHistórico de revisões para esta página neste wikiMediaWiki 1.35.9https://wiki.sj.ifsc.edu.br/index.php?title=PRG122804_2017_2_AULA14&diff=137183&oldid=prevDouglas: /* Acesso a arquivo em MODO TEXTO através de funções de alto nível */2017-10-23T13:28:47Z<p><span dir="auto"><span class="autocomment">Acesso a arquivo em MODO TEXTO através de funções de alto nível</span></span></p>
<table class="diff diff-contentalign-left diff-editfont-monospace" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="pt-BR">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Edição anterior</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Edição das 13h28min de 23 de outubro de 2017</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l93" >Linha 93:</td>
<td colspan="2" class="diff-lineno">Linha 93:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{| border="1" cellpadding="5" cellspacing="0" </div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{| border="1" cellpadding="5" cellspacing="0" </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<del class="diffchange diffchange-inline">ffdead</del>;" | Função </div></td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<ins class="diffchange diffchange-inline">FFD700</ins>;" | Função </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<del class="diffchange diffchange-inline">ffdead</del>;" | Ação</div></td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<ins class="diffchange diffchange-inline">FFD700</ins>;" | Ação</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>|-</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>|-</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>!style="text-align: center;" | fopen() </div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>!style="text-align: center;" | fopen() </div></td></tr>
<!-- diff cache key wiki:diff::1.12:old-137182:rev-137183 -->
</table>Douglashttps://wiki.sj.ifsc.edu.br/index.php?title=PRG122804_2017_2_AULA14&diff=137182&oldid=prevDouglas: /* Sistema de Arquivos */2017-10-23T13:28:32Z<p><span dir="auto"><span class="autocomment">Sistema de Arquivos</span></span></p>
<table class="diff diff-contentalign-left diff-editfont-monospace" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="pt-BR">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Edição anterior</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Edição das 13h28min de 23 de outubro de 2017</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l35" >Linha 35:</td>
<td colspan="2" class="diff-lineno">Linha 35:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>;Sistema de arquivos</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>;Sistema de arquivos</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{| border="1" cellpadding="10" cellspacing="10" </div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{| border="1" cellpadding="10" cellspacing="10" </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<del class="diffchange diffchange-inline">ffdead</del>;" | superbloco</div></td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<ins class="diffchange diffchange-inline">FFD700</ins>;" | superbloco</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<del class="diffchange diffchange-inline">ffdead</del>;" | lista de ''i''-nodes</div></td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<ins class="diffchange diffchange-inline">FFD700</ins>;" | lista de ''i''-nodes</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<del class="diffchange diffchange-inline">ffdead</del>;" | blocos dos arquivos</div></td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>! style="background: #<ins class="diffchange diffchange-inline">FFD700</ins>;" | blocos dos arquivos</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>|}</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>|}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><br></div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><br></div></td></tr>
<!-- diff cache key wiki:diff::1.12:old-137180:rev-137182 -->
</table>Douglashttps://wiki.sj.ifsc.edu.br/index.php?title=PRG122804_2017_2_AULA14&diff=137180&oldid=prevDouglas: /* Ainda funções de acesso a arquivos */2017-10-23T13:24:20Z<p><span dir="auto"><span class="autocomment">Ainda funções de acesso a arquivos</span></span></p>
<table class="diff diff-contentalign-left diff-editfont-monospace" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="pt-BR">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Edição anterior</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Edição das 13h24min de 23 de outubro de 2017</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l429" >Linha 429:</td>
<td colspan="2" class="diff-lineno">Linha 429:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>}</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></syntaxhighlight></div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></syntaxhighlight></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>-----</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>-----</div></td></tr>
</table>Douglashttps://wiki.sj.ifsc.edu.br/index.php?title=PRG122804_2017_2_AULA14&diff=137179&oldid=prevDouglas: Criou página com '=Objetivos= *O sistema de arquivos no Linux; *Tratamento de arquivos no C; *O acesso com funções de alto nível. <br> =O Sistema de Arquivos no Linux= ==O Arquivo== Um arq...'2017-10-23T13:23:46Z<p>Criou página com '=Objetivos= *O sistema de arquivos no Linux; *Tratamento de arquivos no C; *O acesso com funções de alto nível. <br> =O Sistema de Arquivos no Linux= ==O Arquivo== Um arq...'</p>
<p><b>Página nova</b></p><div>=Objetivos=<br />
<br />
*O sistema de arquivos no Linux;<br />
*Tratamento de arquivos no C;<br />
*O acesso com funções de alto nível.<br />
<br />
<br><br />
<br />
=O Sistema de Arquivos no Linux=<br />
<br />
==O Arquivo==<br />
<br />
Um arquivo é um conjunto de dados que pode ser referenciado por um nome e pode ter outros atributos tais como: permissão para leitura e escrita, data da criação, data da última modificação etc.<br />
<br />
Note que um arquivo pode conter dados como por exemplo: um programa C, um programa executável, textos, música, vídeos e fotos. Seja qual for a natureza dos dados o armazenamento será na forma de bits.<br />
<br />
Normalmente, arquivos são armazenados em memórias secundárias, tais como CD e HD (''Hard Disk''). Também podem ser armazenados na memória principal RAM ou uma memória rápida FLASH.<br />
<br />
Quanto a forma como os dados são armazenados, podemos dizer que os arquivos são [http://en.wikipedia.org/wiki/Binary_file binários] ou [http://en.wikipedia.org/wiki/Text_file texto]. Qualquer um deles armazena bits em que em conjunto de 8, representam os bytes, que por sua vez estão associados a um código ASCII.<br />
<br />
==Sistema de Arquivos==<br />
<br />
Um sistema tal como o Linux possui milhares de arquivos. Para que arquivos possam ser acessados e armazenados de forma consistente, eles são organizados em um sistema de arquivos.<br />
<br />
Tipicamente, um sistema de arquivos ocupa uma área de um disco (ou mídia de armazenamento).<br />
Nesta área ficam armazenados blocos de armazenamento dos dados dos arquivos e também as estruturas chamadas de '''inodes'''.<br />
<br />
Um [http://upload.wikimedia.org/wikipedia/commons/a/a2/Ext2-inode.gif inode] é um estrutura que possui as propriedades do arquivo e ponteiros para os blocos que contém os dados do arquivo. Tipicamente um sistema de arquivos possui uma lista de inodes que permite "indexar" cada um dos arquivos do sistema de arquivos.<br />
<br />
Existem vários formatos de sistema de arquivos, dependendo do sistema operacional. No linux os formatos mais conhecidos são: ext2, ext3, ext4 etc. No Windows os mais conhecidos são FAT32 e NTFS.<br />
<br />
Um sistema de arquivos normalmente possui uma estrutura de dados inicial chamada de superbloco. O superbloco traz informações sobre o tamanho de blocos do sistema, o início da lista de inodes (/).<br />
<br />
<br />
;Sistema de arquivos<br />
{| border="1" cellpadding="10" cellspacing="10" <br />
! style="background: #ffdead;" | superbloco<br />
! style="background: #ffdead;" | lista de ''i''-nodes<br />
! style="background: #ffdead;" | blocos dos arquivos<br />
|}<br />
<br><br />
<br />
==Diretórios==<br />
<br />
São arquivos especiais que contém basicamente uma lista contendo nome e inode correspondente dos arquivos que o diretório contém.<br />
<br />
Em um sistema de arquivos, o diretório / é o diretório raiz do sistema, a partir do qual pode-se encontrar todos os demais arquivos.<br />
<br />
==Referência a um arquivo==<br />
<br />
A localização de um arquivo pode ser realizada pela referência absoluta, ou seja, desde o diretório / do sistema:<br />
<br />
cat /etc/passwd<br />
<br />
O comando cat tem por objetivo mostrar no terminal o conteúdo do arquivo ''passwd''. Para que este arquivo seja encontrado na árvore de diretórios, deve-se fornecer a referência absoluta, desde o diretório /<br />
<br />
Uma alternativa de acesso, é o uso da referência relativa ao diretório de trabalho. O conceito de diretório de trabalho é criado pelo interpretador de comandos (''shell''). Desta forma pode-se por exemplo fazer o comando:<br />
<br />
cat passwd<br />
<br />
O sistema procurará o arquivo passwd dentro do diretório de trabalho, que é referenciado armazenado pelo ''shell''. Neste caso, o diretório de trabalho deveria ser ''/etc''<br />
<br />
cd /etc<br />
cat passwd<br />
<br />
==No Linux/Unix tudo é arquivo==<br />
<br />
No Linux, qualquer referência/acesso ao hardware/dispositivos é realizada na forma de acesso a arquivo. Ver arquivos no diretório de dispositivos:<br />
<br />
ls -l /dev<br />
<br />
Como consequência, a partir de um programa em C, é possível abrir e escrever/ler em um dispositivo (desde que se tenha autorização).<br />
<br />
=Acessando arquivos a partir de programas C=<br />
<br />
==Acesso a arquivos: funções de baixo e alto nível==<br />
<br />
Em sistemas do porte do Linux e Windows, por questões de segurança e controle, todo acesso a arquivo é realizado através de código do sistema operacional. Desta forma, um programa que deseja acessar um arquivo deve gerar uma CHAMADA AO SISTEMA.<br />
O Linux, assim como outros sistemas operacionais, possui uma API (Application Programming Interface) bem definida, na forma de um conjunto de chamadas que permitem realizar uma série de funcionalidades (serviços) para os processos (programas em execução).<br />
<br />
Um programa em C realiza uma CHAMADA AO SISTEMA com auxílio de funções da biblioteca C (a glib no caso do Linux).<br />
Duas categorias de funções para acesso a arquivo são disponibilizadas [http://en.wikipedia.org/wiki/C_file_input/output (ver detalhes aqui)]:<br />
*Funções de baixo nível: acessam diretamente o sistema;<br />
*Funções de alto nível: as funções intermediam o acesso, criando buffers no espaço de endereçamento do processo. As funções de baixo nível são invocadas para ler e escrever dados no buffer.<br />
<br />
==Acesso a arquivo em MODO TEXTO através de funções de alto nível==<br />
<br />
O acesso em alto nível é realizado usando uma estrutura do tipo [http://www.gnu.org/software/libc/manual/html_node/Streams.html#Streams FILE] definida no stdio.h.<br />
Todo acesso passa inicialmente por abrir o arquivo (função fopen), ler/escrever (várias funções, tipo fread(), fwrite()) e fechar o arquivo (fclose()).<br />
<br />
A tabela abaixo apresenta as principais funções da<br />
linguagem C para manipulação de arquivos:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" <br />
! style="background: #ffdead;" | Função <br />
! style="background: #ffdead;" | Ação<br />
|-<br />
!style="text-align: center;" | fopen() <br />
|Abre um arquivo.<br />
|-<br />
!style="text-align: center;" | fclose() <br />
|Fecha um arquivo.<br />
|-<br />
!style="text-align: center;" | putc() e fputc() <br />
|Escreve um caractere em um arquivo<br />
|-<br />
!style="text-align: center;" | getc() e fgetc() <br />
|Lê um caractere de um arquivo.<br />
|-<br />
!style="text-align: center;" | fseek() <br />
|Posiciona em um registro de um arquivo<br />
|-<br />
!style="text-align: center;" | fprintf() <br />
|Efetua impressão formatada em um arquivo.<br />
|-<br />
!style="text-align: center;" | fscanf() <br />
|Efetua leitura formatada em um arquivo.<br />
|-<br />
!style="text-align: center;" | feof() <br />
|Verifica o final de um arquivo.<br />
|-<br />
!style="text-align: center;" | fwrite() <br />
|Escreve tipos maiores que 1 byte em um arquivo.<br />
|-<br />
!style="text-align: center;" | fread() <br />
|Lê tipos maiores que 1 byte de um arquivo.<br />
|}<br />
<br><br />
<br />
==Exemplos==<br />
<br />
Nos exemplos que se seguem, serão usadas as funções [http://www.cplusplus.com/reference/cstdio/fopen/ fopen] e [http://www.cplusplus.com/reference/cstdio/fclose/?kw=fclose fclose], para abrir e fechar arquivo e [http://www.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf fprintf()] e [http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf fscanf()] para leitura e escrita.<br />
A forma é similar ao ''printf'' e ''scanf''(ver http://diuf.unifr.ch/pai/ip/tutorials/c/TC02_scanf.pdf), a não ser pelo fato de que a escrita e leitura é realizada no arquivo indicado<br />
por ''p_arq''<br />
<br />
;Exemplo 1: Escrevendo e lendo um arquivo texto de forma formatada:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i;<br />
int res;<br />
<br />
if ((p_arq=fopen("IFSC.txt", "w")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i = 0; i<10;i++) {<br />
/* A funcao fprintf devolve o número de bytes gravados ou EOF se houve erro na gravação */<br />
if((res = fprintf(p_arq,"Linha %d\n",i))==EOF) { <br />
printf("Erro\n");<br />
break;<br />
}<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que se o arquivo IFSC.txt não existir, ele será criado.<br />
Para ver o que foi escrito faça:<br />
cat IFSC.txt<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i,j;<br />
int res;<br />
char buff[100];<br />
<br />
if ((p_arq=fopen("IFSC.txt", "r")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
while(1) {<br />
if((res = fscanf(p_arq,"%s %d",buff,&j))==EOF) { <br />
printf("Fim de leitura\n");<br />
break;<br />
}<br />
printf("%s %d\n",buff,j);<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o fscanf se comporta de forma similar ao scanf. A função retorna o caracter EOF (end-of-file) quando não existe mais dados a serem lidos.<br />
<br />
;Exercício: Implementar uma função que some duas matrizes fornecidas em arquivos de texto separados: MatA.dat e MatB.dat. Colocando o resultado em um outro arquivo de texto com o nome MatC.dat.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i,j,res;<br />
float MatA[5][5], MatB[5][5], MatR[5][5];<br />
<br />
/* Ler a matriz MatA do arquivo */<br />
if ((p_arq=fopen("MatA.dat", "r")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i =0;i<5;i++) {<br />
for (j=0;j<5;j++) {<br />
if((res = fscanf(p_arq,"%f",&MatA[i][j]))==EOF){ <br />
printf("Fim de leitura\n");<br />
break;<br />
}<br />
printf("%f ",MatA[i][j]);<br />
}<br />
printf("\n");<br />
}<br />
fclose(p_arq);<br />
<br />
/* Ler a matriz MatB do arquivo */<br />
<br />
printf("\n\n");<br />
<br />
/* Ler a matriz MatB do arquivo */<br />
if ((p_arq=fopen("MatB.dat", "r")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i =0;i<5;i++) {<br />
for (j=0;j<5;j++) {<br />
if((res = fscanf(p_arq,"%f",&MatB[i][j]))==EOF){ <br />
printf("Fim de leitura\n");<br />
break;<br />
}<br />
printf("%f ",MatB[i][j]);<br />
}<br />
printf("\n");<br />
}<br />
fclose(p_arq);<br />
<br />
/* Calcular a soma das matrizes e colocar resultado em MatR */<br />
<br />
for (i =0;i<5;i++) {<br />
for (j=0;j<5;j++) {<br />
MatR[i][j]=MatA[i][j]+MatB[i][j];<br />
}<br />
} <br />
printf("Resultado da Adição\n"); <br />
for (i =0;i<5;i++) {<br />
for (j=0;j<5;j++) {<br />
printf("%f ", MatR[i][j]); <br />
}<br />
printf("\n"); <br />
} <br />
/* Armazenar MatR em arquivo */<br />
<br />
if ((p_arq=fopen("MatR.dat", "w")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
} <br />
<br />
for (i =0;i<5;i++) {<br />
for (j=0;j<5;j++) {<br />
if((res = fprintf(p_arq,"%f ",MatR[i][j]))==EOF) { <br />
printf("erro\n");<br />
break;<br />
}<br />
}<br />
fprintf(p_arq,"\n");<br />
}<br />
fclose(p_arq); <br />
}<br />
</syntaxhighlight><br />
<br />
;Exemplo 2: Neste exemplo usaremos as funções '''fgetc''' e '''fputc''' para ler e escrever caracteres ASCII nos arquivos. Seja um programa que conta o número de ocorrências do caracter 'a' em um arquivo e reescreve o arquivo sem os "as":<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
main()<br />
{<br />
FILE *fp_fonte,*fp_destino;<br />
int x,cont=0;<br />
<br />
if((fp_fonte=fopen("teste.dat","r")) == NULL) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
if((fp_destino=fopen("dest.dat","w")) == NULL){<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
<br />
/* note que fgetc retorna um inteiro contendo o ASCII lido */<br />
while ((x=fgetc(fp_fonte)) != EOF){<br />
if(x=='a')<br />
cont++;<br />
else<br />
if((x=fputc(x,fp_destino))==EOF) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
} <br />
} <br />
printf("ocorrências de a = %d\n", cont);<br />
fclose(fp_fonte);<br />
fclose(fp_destino);<br />
}<br />
</syntaxhighlight><br />
<br />
;Note<br />
#Que '''fputc''' recebe o caracter como um inteiro mas realiza um ''cast'' para ''unsigned char'' com fins de escrevê-lo no arquivo.<br />
#Substitua 'a' por '\n' e veja o que acontece com o arquivo destino.<br />
<br />
<br />
;Exemplo 3: Neste exemplo vamos explorar o modo de abertura do arquivo para fazer um '''append''' (escrever no final do arquivo).<br />
<br />
<syntaxhighlight lang=c><br />
#include <time.h><br />
#include <stdio.h><br />
<br />
int main(void)<br />
{<br />
time_t ltime;<br />
FILE *fp;<br />
int num;<br />
<br />
time(&ltime); <br />
<br />
if ((fp=fopen("DATA.txt", "a")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
if ((num = fputs( ctime(&ltime), fp )) != EOF ) {<br />
fclose(fp);<br />
} else {<br />
printf("Erro na escrita do arquivo!\n");<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Execute o programa da forma (suponha que se chame LOG_tempo):<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt <br />
<br />
;Exercício: Substitua o modo de '''append''' por uma simples escrita (w). Reexecute o programa conforme especificado anteriormente.<br />
<br />
==Ainda funções de acesso a arquivos==<br />
<br />
A localização corrente do acesso a um arquivo pode ser modificada antes de uma leitura ou escrita. Tipicamente, quando se abre<br />
uma arquivo para leitura/escrita, o "cursor" de acesso é 0, ou seja início do arquivo. Se o arquivo for aberto em modo append, o "cursor" é posicionado no final. A cada acesso (leitura ou esrita), este cursor é incrementado conforme o número de dados lidos ou escritos.<br />
<br />
É possível entretanto modificar a posição deste cursor, tipicamente com as funções ''fseek()'' e ''rewind()''. (ver http://www.gnu.org/software/libc/manual/html_node/File-Positioning.html#File-Positioning)<br />
<br />
Considere o programa abaixo que escreve um vetor de 100 inteiros em um arquivo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int x[100];<br />
<br />
void main()<br />
{<br />
FILE *fp;<br />
<br />
fp = fopen("teste.dat","w");<br />
x[0]=32;<br />
x[90]=11;<br />
fwrite(x, sizeof(int),100,fp);<br />
fclose(fp);<br />
}<br />
</syntaxhighlight><br />
<br />
;Note <br />
#Que o vetor, sendo uma variável global não inicialiazada, será zerado pelo procedimento de ''startup'' do programa. Entretanto, a posição 90 recebe um valor (11).<br />
#Não é possível visualizar o conteúdo do arquivo porque a função '''fwrite()''' grava o arquivo em formato binário.<br />
<br />
Agora observe o programa seguinte que lê especificamente a posição 90 e na sequência restabelece o cursor no início. Note que o fread lê somente um inteiro na posição corrente do arquivo. A posição corrente foi determinada por ''fseek'' e depois retornada para o início com ''rewind''.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int y;<br />
<br />
void main()<br />
{<br />
FILE *fp;<br />
<br />
fp = fopen("teste.dat","r");<br />
fseek(fp, 90*sizeof(int), SEEK_SET);<br />
fread(&y, sizeof(int),1,fp);<br />
printf("y=%d\n", y);<br />
rewind(fp);<br />
fread(&y, sizeof(int),1,fp);<br />
printf("y=%d\n", y);<br />
fclose(fp);<br />
}<br />
</syntaxhighlight><br />
<br />
;Exercício: Considere o programa abaixo. Ele deve acessar uma tabela que se encontra em um arquivo binário. Cada item da tabela se apresenta conforme o registro TRegistro. Implemente a função ''LerTab'' e crie um programa para escrever uma tabela iniciada com uma tabela de 5 registros a fim de testar a função implementada.<br />
<br />
<syntaxhighlight lang= c><br />
#include <stdio.h><br />
<br />
struct TRegistro {<br />
char nome[30];<br />
int idade; <br />
} Registro, *pAux;<br />
<br />
struct TRegistro *LerTab(int indice)<br />
{<br />
}<br />
<br />
void main()<br />
{<br />
pAux=LerTab(3);<br />
if (pAux!=0) {<br />
printf("Nome lido %s\n", pAux->nome);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
-----<br />
[[Imagem:icone_voltar.png|link=PRG122804_2017_2_AULA13]]<br />
[[Imagem:icone_menu.png|link=PRG122804_2017_2#Aulas]]<br />
[[Imagem:icone_prox.png|link=PRG122804_2017_2_AULA15]]</div>Douglas