Programar em C/Entrada e saída em arquivos: diferenças entre revisões

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
m Foram revertidas as edições de 170.66.1.235 (disc) para a última revisão de Abacaxi
Abacaxi (discussão | contribs)
Sem resumo de edição
Linha 218:
* Essa função envolve os conceitos de ponteiro e vetor, que só serão abordados mais tarde.
 
== OutrasMovendo funçõespelo arquivo ==
=== fseek ===
 
Para se fazer procuras e acessos randômicos em arquivos usa-se a função fseek(). Esta move a posição corrente de leitura ou escrita no arquivo de um valor especificado, a partir de um ponto especificado. Seu protótipo é:
int fseek (FILE *fp, long numbytes, int origem);
 
O parâmetro origem determina a partir de onde os numbytes de movimentação serão contados. Os valores possíveis são definidos por macros em stdio.h e são:
 
'''''Nome Valor Significado'''''
SEEK_SET 0 Início do arquivo
SEEK_CUR 1 Ponto corrente no arquivo
SEEK_END 2 Fim do arquivo
 
Tendo-se definido a partir de onde irá se contar, numbytes determina quantos bytes de deslocamento serão dados na posição atual.
 
=== rewind ===
Volta para o começo do arquivo de um fluxo
 
=== feof ===
EOF ("End of file") indica o fim de um arquivo. Às vezes, é necessário verificar se um arquivo chegou ao fim. Para isto podemos usar a função feof(). Ela retorna não-zero se o arquivo chegou ao EOF, caso contrário retorna zero. Seu protótipo é:
int feof (FILE *fp);
 
Outra forma de se verificar se o final do arquivo foi atingido é comparar o caractere lido por getc com EOF. O programa a seguir abre um arquivo já existente e o lê, caracter por caracter, até que o final do arquivo seja atingido. Os caracteres lidos são apresentados na tela:
 
<source lang="C">
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
FILE *fp;
char c;
fp = fopen("arquivo.txt","r"); /* Arquivo ASCII, para leitura */
if(!fp)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
while((c = getc(fp) ) != EOF) /* Enquanto não chegar ao final do arquivo */
printf("%c", c); /* imprime o caracter lido */
fclose(fp);
return 0;
}
</source>
 
Verifique o exemplo.
<source lang="C">
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
FILE *p;
char c, str[30], frase[80] = "Este e um arquivo chamado: ";
int i;
printf("\n\n Entre com um nome para o arquivo:\n");
gets(str); /* Le um nome para o arquivo a ser aberto: */
if (!(p = fopen(str,"w"))) /* Caso ocorra algum erro na abertura do arquivo..*/
{
printf("Erro! Impossivel abrir o arquivo!\n");
exit(1); /* o programa aborta automaticamente */
}
strcat(frase, str);
for (i=0; frase[i]; i++)
putc(frase[i],p);
fclose(p); /* Se nao houve erro,imprime no arquivo e o fecha ...*/
p = fopen(str,"r"); /* Abre novamente para leitura */
c = getc(p); /* Le o primeiro caracter */
while (!feof(p)) /* Enquanto não se chegar no final do arquivo */
{
printf("%c",c); /* Imprime o caracter na tela */
c = getc(p); /* Le um novo caracter no arquivo */
}
fclose(p); /* Fecha o arquivo */
}
</source>
 
== Outras funções ==
{| class="wikitable"
! Função
! Explicação
|-
| feof
| Detecta se o final do arquivo já foi atingido
|-
| ferror
| Verifica se a última operação de leitura ou escrita do fluxo foi executada com sucesso
|-
| fseek
| Movimenta o indicador de posição dentro do arquivo de um fluxo especificado
|-
| rewind
| Volta para o começo do arquivo de um fluxo
|-
| remove
Linha 240 ⟶ 305:
|}
 
=== ferror e perror ===
{{Esboço/Informática}}
Protótipo de ferror:
int ferror (FILE *fp);
 
A função retorna zero, se nenhum erro ocorreu e um número diferente de zero se algum erro ocorreu durante o acesso ao arquivo. se torna muito útil quando queremos verificar se cada acesso a um arquivo teve sucesso, de modo que consigamos garantir a integridade dos nossos dados. Na maioria dos casos, se um arquivo pode ser aberto, ele pode ser lido ou gravado.
 
Porém, existem situações em que isto não ocorre. Por exemplo, pode acabar o espaço em disco enquanto gravamos, ou o disco pode estar com problemas e não conseguimos ler, etc. Uma função que pode ser usada em conjunto com ferror() é a função perror() (print error), cujo argumento é uma string que normalmente indica em que parte do programa o problema ocorreu.
 
<source lang="C">
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
FILE *pf;
char string[100];
if((pf = fopen("arquivo.txt","w")) ==NULL)
{
printf("\nNao consigo abrir o arquivo ! ");
exit(1);
}
do
{
printf("\nDigite uma nova string. Para terminar, digite <enter>: ");
gets(string);
fputs(string, pf);
putc('\n', pf);
if(ferror(pf))
{
perror("Erro na gravacao");
fclose(pf);
exit(1);
}
}while (strlen(string) > 0);
fclose(pf);
}
</source>
 
 
{{AutoCat}}