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)
Abacaxi (discussão | contribs)
Sem resumo de edição
Linha 133:
 
<div style="background-color: #dddddd; padding: 10px; margin: 20px; font-size: 120%;">int '''fwrite''' (void *''dados'', int ''tamanho_do_elemento'', int ''num_elementos'', FILE *''fluxo'');</div>
 
 
 
* Sintaxe quase igual à de printf(); só é necessário adicionar o identificador de fluxo no início.
 
=== fwrite ===
* Esta função envolve os conceitos de ponteiro e vetor, que só serão abordados mais tarde.
 
A função fwrite() funciona como a sua companheira fread(), porém escreve no arquivo. Seu protótipo é:
* Essa função envolve os conceitos de ponteiro e vetor, que só serão abordados mais tarde.
unsigned fwrite(void *buffer,int numero_de_bytes,int count,FILE *fp);
 
A função retorna o número de itens escritos. Este valor será igual a count a menos que ocorra algum erro. O exemplo abaixo ilustra o uso de fwrite e fread para gravar e posteriormente ler uma variável float em um arquivo binário.
 
<source lang="C">
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
FILE *pf;
float pi = 3.1415;
float pilido;
if((pf = fopen("arquivo.bin", "wb")) == NULL) /* Abre arquivo binário para escrita */
{
printf("Erro na abertura do arquivo");
exit(1);
}
if(fwrite(&pi, sizeof(float), 1,pf) != 1) /* Escreve a variável pi */
printf("Erro na escrita do arquivo");
fclose(pf); /* Fecha o arquivo */
if((pf = fopen("arquivo.bin", "rb")) == NULL) /* Abre o arquivo novamente para leitura */
{
printf("Erro na abertura do arquivo");
exit(1);
}
if(fread(&pilido, sizeof(float), 1,pf) != 1) /* Le em pilido o valor da variável armazenada anteriormente */
printf("Erro na leitura do arquivo");
printf("\nO valor de PI, lido do arquivo e': %f", pilido);
fclose(pf);
return 0;
}
</source>
 
Nota-se o uso do operador sizeof, que retorna o tamanho em bytes da variável ou do tipo de dados.
 
=== fputc ===
A função fputc é a primeira função de escrita de arquivo que veremos. Seu protótipo é:
int fputc (int ch, FILE *fp);
 
Escreve um caractere no arquivo.O programa a seguir lê uma string do teclado e escreve-a, caractere por caractere em um arquivo em disco (o arquivo arquivo.txt, que será aberto no diretório corrente).
<source lang="C">
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
FILE *fp;
char string[100];
int i;
fp = fopen("arquivo.txt","w"); /* Arquivo ASCII, para escrita */
if(!fp)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
printf("Entre com a string a ser gravada no arquivo:");
gets(string);
for(i=0; string[i]; i++) putc(string[i], fp); /* Grava a string, caractere a caractere */
fclose(fp);
system ("pause");
return 0;
}
</source>
 
Depois de executar este programa, verifique o conteúdo do arquivo arquivo.txt (você pode usar qualquer editor de textos). Você verá que a string que você digitou está armazenada nele.
 
== Lendo de arquivos ==
Linha 180 ⟶ 246:
=== fgetc ===
* Está função requer como parâmetro o indicador de fluxo do arquivo, retorna um caractere do arquivo ou EOF, caso ocorra um erro ou o final do arquivo seja atingido, podendo ser verificado respectivamente por ''ferror'' e ''feof''.
 
==== Exemplo ====
Exemplo:
<syntaxhighlight lang="C">
#include <stdio.h>
Linha 209 ⟶ 276:
 
=== fgets ===
 
* Ao chamar a função fgets(), você deve fornecer o ponteiro para a string onde os dados lidos devem ser guardados, além do tamanho máximo dos dados a serem lidos (para que a memória reservada à string não seja ultrapassada).
 
Para se ler uma string num arquivo podemos usar fgets() cujo protótipo é:
=== fscanf ===
char *fgets (char *str, int tamanho,FILE *fp);
 
A função recebe 3 argumentos: a string a ser lida, o limite máximo de caracteres a serem lidos e o ponteiro para FILE, que está associado ao arquivo de onde a string será lida. A função lê a string até que um caracter de nova linha seja lido ou tamanho-1 caracteres tenham sido lidos. Se o caracter de nova linha ('\n') for lido, ele fará parte da string, o que não acontecia com gets.
 
A função fgets é semelhante à função gets(), porém, além dela poder fazer a leitura a partir de um arquivo de dados e incluir o caracter de nova linha na string, ela ainda especifica o tamanho máximo da string de entrada. Como vimos, a função gets não tinha este controle, o que poderia acarretar erros de "estouro de buffer". Portanto, levando em conta que o ponteiro fp pode ser substituído por stdin, como vimos acima, uma alternativa ao uso de gets é usar a seguinte construção:
fgets (str, tamanho, stdin);
 
=== fscanf ===
* Sintaxe quase igual à de scanf(); só é necessário adicionar o identificador de fluxo no início.
 
=== freadfscanf ===
A função fscanf() funciona como a função scanf(). A diferença é que fscanf() lê de um arquivo e não do teclado do computador. Protótipo:
int fscanf (FILE *fp,char *str,...);
 
<source lang="C">
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *p;
char str[80],c;
printf("\n\n Entre com um nome para o arquivo:\n"); /* Le um nome para o arquivo a ser aberto: */
gets(str);
if (!(p = fopen(str,"w"))) /* Caso ocorra algum erro na abertura do arquivo..*/
{ /* o programa aborta automaticamente */
printf("Erro! Impossivel abrir o arquivo!\n");
exit(1);
}
fprintf(p,"Este e um arquivo chamado:\n%s\n", str);
fclose(p); /* Se nao houve erro, imprime no arquivo, fecha ...*/
p = fopen(str,"r"); /* abre novamente para a leitura */
while (!feof(p))
{
fscanf(p,"%c",&c);
printf("%c",c);
}
fclose(p);
return 0;
}
</source>
 
=== fread ===
* Essa função envolve os conceitos de ponteiro e vetor, que só serão abordados mais tarde.
 
Podemos escrever e ler blocos de dados. Para tanto, temos as funções fread() e fwrite(). O protótipo de fread() é:
unsigned fread (void *buffer, int numero_de_bytes, int count, FILE *fp);
 
O buffer é a região de memória na qual serão armazenados os dados lidos. O número de bytes é o tamanho da unidade a ser lida. count indica quantas unidades devem ser lidas. Isto significa que o número total de bytes lidos é:
numero_de_bytes*count
 
A função retorna o número de unidades efetivamente lidas. Este número pode ser menor que count quando o fim do arquivo for encontrado ou ocorrer algum erro.
 
Quando o arquivo for aberto para dados binários, fread pode ler qualquer tipo de dados.
 
== Movendo pelo arquivo ==