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.301 ]

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


Outras funções



Arquivos pré-definidos


Quando se começa a execução de um programa, o sistema automaticamente abre alguns arquivos pré-definidos:
  • stdin: dispositivo de entrada padrão (geralmente o teclado);
  • stdout: dispositivo de saída padrão (geralmente o vídeo);
  • stderr: dispositivo de saída de erro padrão (geralmente o vídeo);
  • stdaux: dispositivo de saída auxiliar (em muitos sistemas, associado à porta serial);
  • stdprn: dispositivo de impressão padrão (em muitos sistemas, associado à porta paralela).

Cada uma destas constantes pode ser utilizada como um ponteiro para FILE, para acessar os periféricos associados a eles. Desta maneira, pode-se, por exemplo, usar:

c =getc(stdin);

para efetuar a leitura de um caracter a partir do teclado, ou:

putc(c, stdout);

para imprimí-lo na tela.

fgets

Lê uma string de um arquivo. A função lê a string até que um caracter de nova linha seja lido /n ou tamanho-1 caracteres tenham sido lidos. Se o caracter de nova linha for lido, ele fará parte da string, o que não acontecia com gets. A string resultante sempre terminará com /0 (por isto somente tamanho-1 caracteres, no máximo, serão lidos).

Protótipo: char *fgets (char *str, int tamanho, FILE *fp);
  • Parâmetro 1 "char *str": a variável que receberá a string.
  • Parâmetro 2 "int tamanho": o limite máximo de caracteres a serem lidos.
  • Parâmetro 3 "FILE *fp": o arquivo que será lido.

fputs

Escreve uma string num arquivo.

Protótipo: char *fputs (char *str, FILE *fp);
  • Parâmetro 1: "char *str" - a variável que contém os dados a serem escritos no arquivo.
  • Parâmetro 2: "FILE *fp" - o arquivo a ser escrito.

fread

Leitura de bloco de dados.

Protótipo: unsigned fread (void *buffer, int numero_de_bytes, int count, FILE *fp);
  • Parâmetro 1: "void *buffer" - variável na qual serão armazenados os dados lidos.
  • Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser lido.
  • Parâmetro 3: "int count" - indica quantas unidades devem ser lidas.
    Parâmetro 4: "FILE *fp" - arquivo a ser lido.

fwrite

Leitura de bloco de dados.

Protótipo: unsigned fwrite (void *buffer, int numero_de_bytes, int count, FILE *fp);
  • Parâmetro 1: "void *buffer" - variável na qual serão transmitidos os dados ao arquivo.
  • Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser escrito.
  • Parâmetro 3: "int count" - indica quantas unidades devem ser escritas.
  • Parâmetro 4: "FILE *fp" - arquivo a ser escrito.

fseek

Procuras e acessos randômicos em arquivos. Esta move a posição corrente de leitura ou escrita no arquivo de um valor especificado, a partir de um ponto especificado.

Protótipo: int fseek (FILE *fp, long numbytes, int origem);
  • Parâmetro 1: "FILE *fp" - arquivo a ser manipulado.
  • Parâmetro 2: "long numbytes" - indica quantos bytes o cursor de posição do arquivo será movimentado apartir da sua posição atual.
  • Parâmetro 3: "int origem" - indica apartir de onde os numbytes serão contados. Abaixo uma tabela com os possíveis valores:

Nome Valor Significado
SEEK_SET 0 Início do arquivo
SEEK_CUR 1 Ponto corrente no arquivo
SEEK_END 2 Fim do arquivo


rewind

Retorna a posição corrente do arquivo para o início.

Protótipo: void rewind (FILE *fp);
  • Parâmetro: "FILE *fp" - arquivo a ser manipulado.

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

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

Manipulação de arquivos em C++

Manipulação de imagens no formato PPM

Manipulando arquivos em C (parte 1)

Otimização de algoritmos

  
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