Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

joaomb

varias operacoes com ficheiros

Recommended Posts

joaomb

oi pessoal,

tenho um programa para o qual já desenvolvi algumas funções mas ficaram 2 para fazer, a primeira e ordenar por ordem alfabética a segunda e inserir um elemento numa linha, e se numa posterior estiver algo, esse algo deve avançar,

alguma ideia de como fazer? e que não estou a ver muito bem;

Share this post


Link to post
Share on other sites
pmg

Duas maneiras básicas de fazer o que pretendes são:

1) lês o ficheiro completo para memória, alteras a memória, escreves o ficheiro completo

2) abres dois ficheiros: o original para leitura e outro temporário para escrita. À medida que vais lendo dum, alteras e escreves no outro. Quando terminar o processamento apagas o original e mudas o nome ao temporário.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
joaomb

entao podias dizerme como ler um ficheiro todo seguido para a memoria? eu estava para ir por essa maneira , mas como nao sabia fiz assim(tem um erro, duplica uma palavra, mormalmente a segunda ordenada)

ordena(FILE *fp,int conta,int tamanho)/*conta e o numero de palavras e tamanho o tamanho da maior*/
{
   int i,j,k;
   char entra[conta][tamanho];/** N palavras com M letras no maximo */
   char aux[tamanho];
   rewind(fp);
   i=0;
   while(i<conta){

       fgets(entra[i],MAX,fp);
       i++;
   }
   for(i=1;i<conta;i++)
   {
     for(j=1;j<conta;j++)
         {

          if(strcmp(entra[j-1],entra[j])>0)
           {
           strcpy(aux,entra[j-1]);
           strcpy(entra[j-1],entra[j]);
           strcpy(entra[j],aux);
         }
   }
   }
rewind(fp);
printf("\nPalavras por ordem:\n");
for(k=0;k<conta;k++)
{
   fprintf(fp,"%s",entra[k]);
   printf("%s\n",entra[k]);

}



}

Edited by joaomb

Share this post


Link to post
Share on other sites
pmg

Digamos que o teu ficheiro de texto tem no máximo 100000 linhas em que cada uma tem, no máximo, 500 caracteres.

#include <stdio.h>

int main(void) {
   FILE *handle;

   handle = fopen("whatever", "r");
   if (!handle) {
       /* erro */
   } else {
       size_t nlines = 0;
       char texto[100000][500];
       while (fgets(texto[nlines], 500, handle)) {
           /* aqui podes validar se a linha cabe nos 500 caracteres */
           /* aqui podes apagar o '\n' no final de cada linha */
           nlines += 1;
       }
       fclose(handle);

       /* o ficheiro completo está agora no array `texto` */
       /* podes ordenar ou fazer o que quiseres */
       /* e depois escrever tudo em disco */

   }
   return 0;
}

Obviamente, o uso de alocação dinâmica de memória (em vez do array `texto`) torna o programa mais adaptável no que respeita a tamanhos de ficheiros e comprimentos de linhas.

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
pmg

O size_t é um tipo de dados (como unsigned long int) que serve para conter tamanhos de objectos, indices de arrays, etc. É um typedef para um tipo unsigned e, portanto, não pode ter valores negativos.

Eu uso-o sempre para indexação de arrays.

Podes usar int em vez dele, mas o size_t é mais apropriado.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.