Forum Pplware
Ajuda em C -> Manipulação de Ficheiros com strings - Versão de Impressão

+- Forum Pplware (http://forum.pplware.com)
+-- Fórum: Mais Tech (/forumdisplay.php?fid=11)
+--- Fórum: Programação e Web (/forumdisplay.php?fid=16)
+--- Tópico: Ajuda em C -> Manipulação de Ficheiros com strings (/showthread.php?tid=2356)

Páginas: 1 2


Ajuda em C -> Manipulação de Ficheiros com strings - zeguel - 16-05-2009 15:38

Boas, para um trabalho tenho que fazer um programa que faça uma simulação do crescimento de uma cidade...

Então é assim, eu carrego o ficheiro com o mapa da cidade, e depois supostamente tenho que carregar o ficheiro com as regras de alteração da cidade...

Aqui começam os problemas, as regras são do tipo S=W:W (ou seja se a casa actual(S) for igual a W entao passa a W), esta é a regra mais básica...

O problema está em como fazer com que o meu programa consiga olhar para o ficheiro e interpretar os caracteres na posição correcta, ou seja, S=casa actual, W=hipotese , W=como vai ficar....

Eu estive a olhar pra isto algum tempo e tive a tentar resolver, mas nao consigo nada, primeiro acho que é melhor ler do ficheiro, regra a regra ou seja com o fgets leio uma linha do ficheiro e depois interpreto, só que nao sei como fazer isso, já tive a ver o sscanf, strtok, etc...mas torna-se tudo muito confuso... só quero que me digam qual seria a abordagem que teriam se lhes aparece-se um problema destes...

cmps...


RE: Ajuda em C -> Manipulação de Ficheiros com strings - R00KIE - 16-05-2009 16:07

Os meus conhecimentos de C estão um bocado enferrujados mas não podias ler "aos bocados" para dentro de uma estrutura de dados?
Os dados devem ter uma organização fixa, tipo cada linha tem X caracteres e cada um faz uma coisa, se leres isso para uma estrutura de dados ficas logo com tudo no sítio para tratares, mudares e reescrever para o ficheiro .... digo eu Tongue


RE: Ajuda em C -> Manipulação de Ficheiros com strings - zeguel - 16-05-2009 16:58

(16-05-2009 16:07)R00KIE Escreveu:  Os meus conhecimentos de C estão um bocado enferrujados mas não podias ler "aos bocados" para dentro de uma estrutura de dados?
Os dados devem ter uma organização fixa, tipo cada linha tem X caracteres e cada um faz uma coisa, se leres isso para uma estrutura de dados ficas logo com tudo no sítio para tratares, mudares e reescrever para o ficheiro .... digo eu Tongue

eu nao quero reescrever no ficheiro, depois tenho que implementar tudo no ficheiro da area que já recebi, mas isso depois de guardado é relativamente simples..

ironia ou não, eu faço isto

Código:
int loop;
    char *rule;
    const char delimiters_div[] = ", :";
    char *array[20];
    char ficheiro_regras[100];
    rule=NULL;    
    do
    {
    fgets(ficheiro_regras,100,m);             
        array[0]=strtok (ficheiro_regras, delimiters_div); /* token => "tudo da regra divido em , e :" */
  if(array[0]==NULL)
   {
    printf("Mal formulada\n");
    exit(10);
   }

  for(loop=0;loop<100;loop++)
   {
    array[loop]=strtok (ficheiro_regras, delimiters_div);
    if(array[loop]==NULL)
      break;
   }    
    }while(rule!=NULL);
}

agora o que eu quero é interpretar e depois mandar para uma lista ligada...

Código:
typedef struct regras
{
    struct hipotes
        {
        char *hipot;
        char *prox_hip;    
        }*Hipotese;
        
    struct condicao
        {
            char *condicion;
            char *or;
            int *valor_log;
            char *prox_cond;
        }*Condicao;
        
        char *nv_valor;
        struct regras *proxima;
}*Regras;
atenção que a estrutura pode estar mal formulada, eu o pouco que sei de C nao abrange em grande parte as estruturas...Confused


RE: Ajuda em C -> Manipulação de Ficheiros com strings - Ana - 16-05-2009 19:29

Olá Smile

Se bem percebi, tu precisas de ler um ficheiro e aproveitar de lá certos parametros, interessando-te guardá-los em variáveis.

Nunca usaste o mágico fscanf?

http://www.cppreference.com/wiki/c/io/fscanf
http://www.manpagez.com/man/3/fscanf/

Tu lês o ficheiro da seguinte forma, certo?

Código:
./executavel < ficheiro

O fscanf é um scanf, ou seja, lê input formatado, mas para file descriptors. No teu caso, tu queres ler do stdin.

Por isso, imagina que o teu ficheiro tinha o seguinte conteúdo:


Código:
1 2 3

Fazias:

Código:
fscanf(stdin, "%d %d %d, &num1, &num2, &num3);

Automaticamente, as variáveis num1, num2 e num3 têm os valores 1, 2 e 3 respectivamente.
Podes aplicar a mesma lógia a outros tipos de dados (char, char*, float, etc.).

A vantagem do fscanf é que lê o input FORMATADO, ou seja, se fazes:

Código:
fscanf(stdin, "Olá eu tenho %d anos e nasci no ano %d", &idade, &nascimento);

Basta que o teu ficheiro possua essa mesma frase e ele "encaixa" sem problemas os parâmetros variáveis que encontrar.
No teu caso, os teus parâmetros variáveis são as letras (char).

Espero ter ajudado.


RE: Ajuda em C -> Manipulação de Ficheiros com strings - zeguel - 16-05-2009 23:35

(16-05-2009 19:29)Ana Escreveu:  Olá Smile

Se bem percebi, tu precisas de ler um ficheiro e aproveitar de lá certos parametros, interessando-te guardá-los em variáveis.

Nunca usaste o mágico fscanf?

http://www.cppreference.com/wiki/c/io/fscanf
http://www.manpagez.com/man/3/fscanf/

Tu lês o ficheiro da seguinte forma, certo?

Código:
./executavel < ficheiro

O fscanf é um scanf, ou seja, lê input formatado, mas para file descriptors. No teu caso, tu queres ler do stdin.

Por isso, imagina que o teu ficheiro tinha o seguinte conteúdo:


Código:
1 2 3

Fazias:

Código:
fscanf(stdin, "%d %d %d, &num1, &num2, &num3);

Automaticamente, as variáveis num1, num2 e num3 têm os valores 1, 2 e 3 respectivamente.
Podes aplicar a mesma lógia a outros tipos de dados (char, char*, float, etc.).

A vantagem do fscanf é que lê o input FORMATADO, ou seja, se fazes:

Código:
fscanf(stdin, "Olá eu tenho %d anos e nasci no ano %d", &idade, &nascimento);

Basta que o teu ficheiro possua essa mesma frase e ele "encaixa" sem problemas os parâmetros variáveis que encontrar.
No teu caso, os teus parâmetros variáveis são as letras (char).

Espero ter ajudado.

Tens toda a razão, agora eu tou a fazer um trabalho, logo concerteza o prof vai colocar erros propositados no ficheiro, mas era apenas fazer condições para garantir isso, ok, agora as funções nao sao tão triviais...

Código:
s=C, C=0:C
s=C, C=2:C
s=C,C=4:C
estas são simples...
Código:
s=C,    C=3    :    C
s=C,    C>=5, C <= 8    :    C
    C        =    4    ,    s    =    R        :    C  
C>=6,s=R, C <= 9:C
s=C:R
agora imagina isto... até poderia ter uma funçãozita p retirar os espaços só que nunca iria ser capaz de escrever uma função que conseguisse ler todas as regras possiveis ex: s=C, C=3 , s=R, C <= 9:C


RE: Ajuda em C -> Manipulação de Ficheiros com strings - Ana - 16-05-2009 23:51

O fscanf ignora automaticamente espaços, ou seja admite número de espaços variável. Wink

Mas se tiveres de detectar erros sintáticos... isso sim, fscanf não é boa ideia.


RE: Ajuda em C -> Manipulação de Ficheiros com strings - zeguel - 17-05-2009 00:02

(16-05-2009 23:51)Ana Escreveu:  O fscanf ignora automaticamente espaços, ou seja admite número de espaços variável. Wink

Mas se tiveres de detectar erros sintáticos... isso sim, fscanf não é boa ideia.

isso d ignorar os espaços nao sabia,Wink, for that...

mas acho que a questão está em se ler com o fscanf, nao consigo ter a total noção do que me pode aparecer, não é...

Código:
fscanf(stdin, "%d %d %d, &num1, &num2, &num3);
aqui é tudo certinho sabes q vou receber 3 cenas, mas eu nao controlo isso no ficheiro, por isso é que é tão complicado...
eu queria saber era se me aconcelham alguma técnica pa abordar isso...
tipo, eu tou a avançar as a cena tá a ficar gigante, mtos if's e for's... eu pensei no inicio em usar o strtok pa dividir em pequenas strings, e apartir daí tratar com sscanf e escolher o que queria mas isso tava m a dar umas segmentation faults e abandonei a ideia, que aconcelham?


RE: Ajuda em C -> Manipulação de Ficheiros com strings - Ana - 17-05-2009 00:44

Pois... se o input não é mais ou menos certinho, então esquece.

Tens a certeza que no enunciado desse trabalho não diz nada acerca de input bem formado? Já falaste com o professor? Normalmente eles não complicam muito.

Uma vez fiz um parse para um ficheiro de entrada, a contar com erros e tudo e ficou gigante...

Mas sim, a abordagem do strtok é a melhor nesses casos, usando para isso os delimitadores do teu enunciado. A partir daí, se tiveres a certeza cada fragmento é sintaticamente correcto, podes usar o fscanf.


RE: Ajuda em C -> Manipulação de Ficheiros com strings - zeguel - 17-05-2009 01:04

(17-05-2009 00:44)Ana Escreveu:  Pois... se o input não é mais ou menos certinho, então esquece.

Tens a certeza que no enunciado desse trabalho não diz nada acerca de input bem formado? Já falaste com o professor? Normalmente eles não complicam muito.

Uma vez fiz um parse para um ficheiro de entrada, a contar com erros e tudo e ficou gigante...

Mas sim, a abordagem do strtok é a melhor nesses casos, usando para isso os delimitadores do teu enunciado. A partir daí, se tiveres a certeza cada fragmento é sintaticamente correcto, podes usar o fscanf.

olha esquece mesmo, acabei á pouco, e tenho 200 linhas ConfusedConfused....
yah o prof complica bues, tipo isto era por fases , a primeira era a propagação de fogos e a maior parte do pessoal nem se preocupou com caracters inválidos, na apresentação, levamos uma coça...mas enfim....

passando á frente...
tenho esta estrutura
Código:
typedef struct hipotes
{
        char *hipot;
        char *prox_hip;    
}*Hipotese;
typedef struct condicao
        {
            char *condicion;
            int *valor_log;
            char *prox_cond;
        }*Condicao;
typedef struct regras
{    
        Hipotese estrutura1;
        Condicao estrutura2;
        char *nv_valor;
        struct regras *proxima;
}*Regras;

e quero escrever lá, como invoco isto?
já tentei definir uma var do tipo Regras ex: Regras var , mas dpois dá m erro


já agora obrigado pelas respostas....


RE: Ajuda em C -> Manipulação de Ficheiros com strings - Ana - 17-05-2009 02:11

Tu estás por acaso a alocar os espaço para a estrutura? Sabes que quando trabalhas com estruturas não basta declarar variáveis do tipo da estrutura e escrever lá.

Para já, precisas de funções auxiliares que te aloquem e "desaloquem" espaço para cada estrutura, e para cada campo, no caso das strings.

Supomos que o tamanho máximo de cada string é 1000, por exemplo.

Alterei um pouco o teu código, não percebo porque colocas *Estrutura, não há necessidade, quando declarares a estrutura, aí sim, declaras como ponteiro.

Aqui está o teu código original modificado (eu sou um bocado picuinhas com as normas), e acrescentei-te algumas funções.

Código:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 1000

typedef struct hipotese
{
  char *hip;
  char *prox_hip;    
} hipotese_t;

typedef struct condicao
{
  char *cond;
  char *prox_cond;
  int *valor_log;
} condicao_t;

typedef struct regra
{    
  hipotese_t estrutura1;
  condicao_t estrutura2;
  char *nv_valor;
  struct regra *proxima;
} regra_t;


/* Aloca espaço para uma nova hipotese, e para os seus campos */
hipotese_t *nova_hipotese(char *hip, char *prox_hip) {

  hipotese_t *nova = (hipotese_t *)malloc(sizeof(hipotese_t));

  nova->hip = (char *)malloc(MAX * sizeof(char));
  strncpy(nova->hip, hip, MAX);
  nova->prox_hip = (char *)malloc(MAX * sizeof(char));
  strncpy(nova->prox_hip, prox_hip, MAX);

  return nova;
}

/* Liberta os campos de uma hipotese e por fim a própria hipótese */
void liberta_hipotese(hipotese_t *hipotese) {
  free(hipotese->hip);
  free(hipotese->prox_hip);
  free(hipotese);
}



int main(void) {

  char *hip = "A";
  char *prox_hip = "B";

  /* Estou a criar uma nova hipotese usando os argumentos definido acima */
  hipotese_t *hipotese = nova_hipotese(hip, prox_hip);


  printf("hip: %s\nprox_hip: %s\n", hipotese->hip, hipotese->prox_hip);

  /* No fim, libertar SEMPRE toda a memória alocada */
  liberta_hipotese(hipotese);

  return 0;
}

Ou aqui, para veres com cores: http://pastebin.com/f75efa66

Atenção:
Eu apenas criei a função de criação e destruição da tua estrutura hipotese.
Tens de fazer o mesmo para a estrutura condicao.
Depois para a estrutura regra, inicializas o campo hipotese e condicao com as funções de criação de hipoteses e condições acima descritas.

Se não perceberes alguma função, faz no terminal (em Linux ou Mac): man nome_da_funcao

Boa sorte!
(Isso deu um bocadinho de trabalho, agora vou dormir Tongue )