Ir para o conteúdo
joaomb

varias operacoes com ficheiros

Mensagens Recomendadas

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;

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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]);

}



}

Editado por joaomb

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.