Manipulando arquivos em C (parte 2)

Esta é a segunda parte de um tutorial que trata a manipulação de arquivos em C. Aqui veremos o funcionamento de funções como: fprintf, fscanf, fwrite, fread, fseek, etc.

[ Hits: 107.253 ]

Por: Kleber de Andrade Reis em 09/04/2005


Lendo e escrevendo em um arquivo usando fprintf e fscanf



fprintf

Escreve uma constante de caracteres em um arquivo, essa função funciona como printf, sendo que a diferença é a saída padrão, que em fprintf é um arquivo e em printf é o monitor.

Protótipo: int fprintf (FILE *fp, const char *format,...);
  • Parâmetro 1: "FILE *fp" - o arquivo a ser escrito.
  • Parâmetro 2: "const char *format" - o que será escrito.

fscanf

Lê uma constante de caracteres de um arquivo, essa função funciona como scanf, sendo que a diferença é a entrada padrão que em fscanf é um arquivo e em scanf é o teclado.

Protótipo: int fscanf (FILE *fp, const char *format,...);
  • Parâmetro 1: "FILE *fp" - o arquivo a ser lido.
  • Parâmetro 2: "const char *format" - qual a variável que receberá os dados do arquivo.

Exemplo do uso das funções fprintf e fscanf


/* Lendo e escrevendo em um arquivo */

#include <stdio.h>
#include <stdlib.h>
int main()
{
        FILE *fp;
        char s[50],c;

        /* Lê um nome para o arquivo a ser aberto: */
        printf("\n\n Digite o caminho completo inclusive o nome para o arquivo:\n");
        gets(s);

        if (!(fp = fopen(s,"w")))  /* Caso ocorra algum erro na abertura do arquivo o programa será finalizado */
        {
                printf("Erro! Impossível abrir o arquivo!\n");
                exit(1);
        }
        /* Se não houve erro, imprime no arquivo...*/
        fprintf(fp,"Este e um arquivo chamado:\n%s\n", s);
        fclose(fp);   /* fecha o arquivo  */

        /* abre novamente para a leitura  */
        fp = fopen(s,"r");
        while (!feof(fp))
        {
                fscanf(fp,"%c",&c);
                printf("%c",c);
        }
        fclose(fp);
        return(0);
}
Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Lendo e escrevendo em um arquivo usando fprintf e fscanf
   3. Outras funções
   4. Bibliografia e conclusão
Outros artigos deste autor

Manipulando arquivos em C (parte 1)

Leitura recomendada

Manipulação de arquivos em C++

Manipulando arquivos em C (parte 1)

DoTheWorld - Biblioteca completa para manipulação de Arquivos e Pastas em C

Manipulação de imagens no formato PPM

Ponteiros void na linguagem C

  
Comentários
[1] Comentário enviado por jllucca em 10/04/2005 - 16:45h

Oi,

tenho uma coisa a acrescentar. Toda a saida/entrada é bufferizada no C, como podemos provar isso? Escreva um arquivo de nomes por exemplo:
Fulano de tal
Joaquim Pidim
Usi De Vi

Quando abrirmos o arquivo e recuperar o primeiro "Nome completo" usando: fscanf(fp, "%s", str); . Teremos como resultado "Fulano" e não Fulano de tal.Poderiamos deixar os nomes com tamanho de 30 espaços sendo apartir do ultimo sobrenome espaços, mas seria uma solução horrivel.

Mais facil é usar um atributo que permite agente dizer "onde" o C deve parar de ler, isso pode ser feito com esse: fscanf(fp,"%[^\n]s",str); . Isso irá trazer "de tal" para str. Em seguida, "Joaquim Pidim" e depois "Usi De Vi" sem complicação ou feitos revolucionarios :p

Bom espero ter sido claro, pois é um atributo incrivel não só pro fscanf mas em outras funções tb.

[]'s

[2] Comentário enviado por doug_cpp em 11/04/2005 - 17:14h

Legal o recurso de usar %[^\n]s, faz parte dos segredos da linguagem - parabéns ao jllucca e também ao kandrade pelo artigo.

Uma opção alternativa e mais fácil de capturar uma frase com espaços de um arquivo é usar o

fgets(nomeVar, 20, nomeArquivo);

Que atribuirá à variável 'nomeVar' o que foi lido no arquivo 'nomeArquivo'. O fgets não apresenta o problema do fscanf usado de maneira tradicional. Ele captura a linha inteira (no exemplo que dei, até o limite de 19 caracteres (20-1), ou até encontrar o \n - indicando fim da linha).

Abraços a todos - estou meio sumido :)
Douglas

[3] Comentário enviado por jllucca em 11/04/2005 - 17:50h

Realmente tem essa opção, mas ela deixara o "\n" na string. O que pode ser mais incomodo...

[4] Comentário enviado por kandrade em 11/04/2005 - 19:25h

ae galera valeu pelos comentários....

[5] Comentário enviado por kandrade em 11/04/2005 - 19:25h

quanto ao uso de fgets ou fscanf ainda prefiro usar o fgets mesmo com esse recurso de fscanf que pra falar a verdade não conhecia.......

fgets(var, MAX, stdin);
var[strlen(var) - 1] = 0;


te+

[6] Comentário enviado por mmilton62 em 27/08/2007 - 12:14h

Olá, alguem teria por ai um codigo em C p/ ler a serial, mas que possa dizer " eu fiz assim e funcionou", a ideia é ler um caracter que entra pela serial. Eu já procurei muito mas as respostas geralmente são vazias e apontam p/ lugar vazio...
Agradeço pela ajuda. ;-)

[7] Comentário enviado por kandrade em 19/01/2010 - 10:33h

O jllucca é o cara, aprendi muito com ele.
Muito obrigado pela contribuição!

[8] Comentário enviado por removido em 15/06/2010 - 19:18h

Nossa, é exatamente isso que eu preciso fazer no meu trabalho de programação que vale 30 pontos! Só que eu não tô entendendo nada o.O
não entendi isso ó:

if (!(arq = fopen(s,"w")))

alguém me explica? Nunca vi isso de "(!(...". O que essa parte significa?

[9] Comentário enviado por removido em 15/06/2010 - 19:29h

Outra dúvida, eu tenho aulas de programação em C bem básicas mesmo. Nunca vi fprintf ou fscanf mas só printf e scanf. Qual a diferença?

[10] Comentário enviado por xcolares em 23/06/2010 - 23:44h

Gostaria de saber como faço para ler um arquivo sendo que só o que me interessa nele e a linha que começa com //# e termina também com //# como o exemplo abaixo:
esse é o arquivo, o que quero dele é somente isto:
float Tf=0.058e-6, Tt=500e-6, a1=1.93147180e0/Tf, a2=2.558427881e0/Tt, t0=log(a1/a2)/(a1-a2), Ao=exp(-a1*t0)-exp(-a2*t0), omegao=4.0*atan(1.0)/(3.0*Tf);
for (n=1; n<=nt; n++){
if((n*dt)<=(1.5*Tf)){
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt))*powf((sin(omegao*(float)(n)*dt)),2.0) ;
}else
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt));
}
Se alguém puder me ajudar agradeço.
Adolfo Colares

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const float dt = 4.240384E-10;
nt=t/dt;
float fonte[nt+1];


//############### dados inseridos pelo usuario ###############
float Tf=0.058e-6, Tt=500e-6, a1=1.93147180e0/Tf, a2=2.558427881e0/Tt, t0=log(a1/a2)/(a1-a2), Ao=exp(-a1*t0)-exp(-a2*t0), omegao=4.0*atan(1.0)/(3.0*Tf);
for (n=1; n<=nt; n++){
if((n*dt)<=(1.5*Tf)){
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt))*powf((sin(omegao*(float)(n)*dt)),2.0) ;
}else
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt));
}
//############################################################
FILE *fonte_dat=fopen("dats/fonte.dat","w+");
for(n=0;n<=nt;++n){
fprintf(fonte_dat,"%E\n",fonte[n]);
}
fclose(fonte_dat);

[11] Comentário enviado por Tacioandrade em 28/10/2011 - 17:44h

Alguem aqui sabe se tem como descobrir se o arquivo é de texto ou binário em C?

Não sou programador em C, porem para a faculdade estou tendo que criar um compilador usando esta linguagem. No meu analisador Léxico, preciso pagar e abrir um arquivo de texto e apartir dele fazer a análise. Eu já criei um método que me retorna se o arquivo existe ou não, usando o fopen, porem acontece que mesmo se o arquivo for binário ele será "analisado" e eu gostaria de fazer a verificarão se é binário ou de texto antes de executar a análise para não perder tempo.


Se alguem souber uma forma agradeceria, pois procurei no google e não achei.


Segue meu método de checar se o arquivo existe.

int arquivoExiste(const char *filename) {
FILE *arquivo;

if(arquivo = fopen(filename, "r")) {
fclose(arquivo);
return 1;
}
return 0;
}


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts