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.
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.
/* 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);
}
[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.
[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).
[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. ;-)
[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?
[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
[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;