Acquisizione stringhe da file con il C

di il
6 risposte

Acquisizione stringhe da file con il C

Ciao a tutti, io dovrei scrivere una funzione in c che acquisisca da file una stringa di caratteri, il mio problema è che non devo condiderare la prima riga del file di testo e non devo prenderlo tutto...
questo è il mio file

ID Day Hygr Temp
1435 09 0.48 30
1435 21 0.76 24
1435 28 0.32 22
2307 03 0.54 19
2307 14 0.82 14
0081 18 0.46 30
0081 21 0.86 34

io dovrei caricare nella stringa, che una dimensione fissa,: 1435 09 0.48 30
qualcuno mi può aiutare???

6 Risposte

  • Re: Acquisizione stringhe da file con il C

    Non capisco... devi scorrere il file ed estrapolare solo una riga di valori o caricare una serie?
    Poi perchè dici 'stringhe' quando sono valori float?

    Saluti,
    Max
  • Re: Acquisizione stringhe da file con il C

    Ti allego un bozzeto per caricare l'eventuale lista di valori.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct s_dati
    {
      float a;
      float b;
      float c;
      float d;
      
      struct s_dati *next;
    };
    
    struct s_dati *FIRST=NULL;
    struct s_dati *LAST =NULL;
    
    void show_list (int n)
    {
      struct s_dati *node=FIRST;
      
      printf ("There are %d element(s) loaded:\n",n);
      while (node)
      {
        printf ("a=%04.0f b=%02.0f c=%01.2f d=%02.0f\n",node->a,node->b,node->c,node->d);
        node=node->next;
      }
    }
    
    void free_list ()
    {
      struct s_dati *next,*node=FIRST;
      while (node)
      {
        next=node->next;
        free (node);
        node=next;
      }
    }
    
    int load_file (FILE *fp)
    {
      int n;
      
      struct s_dati *node;
      
      /* Drop first line */
      while (fgetc(fp)!='\n' && !feof(fp));
      
      while (!feof(fp))
      {
          node=(struct s_dati*)malloc (sizeof(struct s_dati));
          if (!node) 
            return 0;
    
          
          fscanf (fp,"%f %f %f %f",&(node->a),&(node->b),&(node->c),&(node->d));
          if (feof(fp))
          {
            free (node);
            break;
          }
          
          /*
            ------------------------------------
            Add your check code here 
            use free(node) and 'break' to return
            ------------------------------------
          */
          
          n++;
          
          
          node->next=NULL;
          if (!FIRST) FIRST=node;
          if (LAST)   LAST->next=node;
          LAST=node; 
          
      }
      
      return n;
    }
    
    main()
    {
      FILE *fp;
      int n;
      
      fp=fopen ("./file","r");
      if (!fp)
        return 1;
      
      n=load_file (fp);
      show_list (n);
      free_list ();
      
      fclose (fp);
      
      return 0;
    }
    
  • Re: Acquisizione stringhe da file con il C

    ixamit ha scritto:


    #include <stdio.h>
    #include <stdlib.h>

    struct s_dati
    {
    float a;
    float b;
    float c;
    float d;

    struct s_dati *next;
    };
    con questo mi creo quindi una struttura dove metto i miei dati giusto? fin qui ok...
    ma come faccio a prendere i dati da mettere nella struttura se li ho scritti su un file? e condisera che non devo prendere la prima riga del file e devo considerare ogni struttura separatamente e devo farla diventare una stringa?
  • Re: Acquisizione stringhe da file con il C

    Il sorgente che ti ho allegato fa quello che dici.
    Ti sei limitato a guardare la definizione della struct?

    Saluti,
    Max
  • Re: Acquisizione stringhe da file con il C

    Scusami, ma dato ke il mouse del mio pc ogni tnt impazzisce e non mi funziona come dovrebbe, molto probabilmente quando ho letto il tuo codice mi ha fregato e non mi scorreva in sotto e ho pensato che non c'era altro.... sorry
    ora lo provo!! grazie e scusami...
  • Re: Acquisizione stringhe da file con il C

    ixamit ha scritto:


    Ti allego un bozzeto per caricare l'eventuale lista di valori.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct s_dati
    {
      float a;
      float b;
      float c;
      float d;
      
      struct s_dati *next;
    };
    
    struct s_dati *FIRST=NULL;
    struct s_dati *LAST =NULL;
    
    void show_list (int n)
    {
      struct s_dati *node=FIRST;
      
      printf ("There are %d element(s) loaded:\n",n);
      while (node)
      {
        printf ("a=%04.0f b=%02.0f c=%01.2f d=%02.0f\n",node->a,node->b,node->c,node->d);
        node=node->next;
      }
    }
    
    void free_list ()
    {
      struct s_dati *next,*node=FIRST;
      while (node)
      {
        next=node->next;
        free (node);
        node=next;
      }
    }
    
    int load_file (FILE *fp)
    {
      int n;
      
      struct s_dati *node;
      
      /* Drop first line */
      while (fgetc(fp)!='\n' && !feof(fp));
      
      while (!feof(fp))
      {
          node=(struct s_dati*)malloc (sizeof(struct s_dati));
          if (!node) 
            return 0;
    
          
          fscanf (fp,"%f %f %f %f",&(node->a),&(node->b),&(node->c),&(node->d));
          if (feof(fp))
          {
            free (node);
            break;
          }
          
          /*
            ------------------------------------
            Add your check code here 
            use free(node) and 'break' to return
            ------------------------------------
          */
          
          n++;
          
          
          node->next=NULL;
          if (!FIRST) FIRST=node;
          if (LAST)   LAST->next=node;
          LAST=node; 
          
      }
      
      return n;
    }
    
    main()
    {
      FILE *fp;
      int n;
      
      fp=fopen ("./file","r");
      if (!fp)
        return 1;
      
      n=load_file (fp);
      show_list (n);
      free_list ();
      
      fclose (fp);
      
      return 0;
    }
    

    inanzitutto grazie, posso chiederti se mi puoi spiegare meglio cosa fa il codice?
    io ho capito che risolve il mio problema, ma non ho ben capito come, scusa ma di c non me ne intento ancora bene, e anche perchè nel compilarlo mi sono venuti degli errori....

    codice.c: In function ‘load_file’:
    codice.c:56: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result
    codice.c: At top level:
    codice.c:84: warning: return type defaults to ‘int’

    ah poi ho visto che usi un comando "break" io ho letto che è meglio non usarli, se lo volessi sostituite che altro comando potrei usare grazie...
Devi accedere o registrarti per scrivere nel forum
6 risposte