Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9

    [C] leggere da file .txt saltando la prima riga

    Salve a tutti, vi sottopongo il mio problema.
    Dovrei acquisire da un file .txt dei valori ( numeri reali), il problema è che il file .txt è cosi fatto:

    FA FB FC
    3.44 3.81 87.9
    5.7 2.3 3.4
    ... ... ...

    a me interessa prendere ogni singola colonna e metterla in un array di float ma saltando la prima riga in modo da fare le successive elaborazioni solo sui numeri.

    io ho provato a fare cosi:


    #include <stdio.h>
    #include <stdlib.h>
    float a ;
    int main ()
    {
    FILE *s;
    s = fopen("mio.txt", "r");

    /* controlla se il file viene aperto */
    if ((s = fopen("mio.txt", "r")) == NULL)
    {
    printf("Non posso aprire il file %s\n", "miofile.txt");
    }


    while(fscanf(s,"%f",&a)!=EOF)
    {
    printf ( "%f\n", a);
    }


    system("PAUSE");

    }

    // FINE CODICE

    Con Questo codice però riesco a leggere solo file in cui sono presenti numeri per es

    3.44 3.81 87.9
    5.7 2.3 3.4
    ... ... ...
    appena carico il file in cui è presente la prima riga (FA FB FC ) il programma entra in loop infinito.

    Potreste darmi dei consigli su come fare a saltare la prima riga?
    Grazie

  2. #2

    Re: [C] leggere da file .txt saltando la prima riga

    Originariamente inviato da aletrc
    a me interessa prendere ogni singola colonna e metterla in un array di float ma saltando la prima riga in modo da fare le successive elaborazioni solo sui numeri.
    Per leggere la prima riga puoi usare fgets prima del ciclo.

    Un'altra soluzione consiste nel controllare il valore di ritorno della fscanf e nel caso sia 0 sposti il puntatore di lettura del file avanti di una posizione (con fseek). Così facendo, anche se hai dei float sulla prima riga, oppure lettere in mezzo al file, la situazione sarebbe gestita.

  3. #3
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    la lettura dei file in C è sempre sequenziale, in pratica la prima riga viene sempre letta, devi inventarti tu un modo, una struttura di controllo, per saltarne l'acquisizione se non ti interessa, ma viene comunque letta.

    potresti inserire una variabile "contatore" o che simili un booleano, aggiungere una struttura di controllo e risolvere così.

  4. #4
    codice:
    void skip_line(FILE * stream)
    {
        while(getc(stream)!='\n')
            ;
    }
    Non particolarmente efficiente, ma dovrebbe risolvere il tuo problema.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9
    Grazie, ho risolto usando la funzione fgets,
    adesso però mi sorge un dubbio.
    sono riuscito a spittare il file in 4 array in questo modo:
    Vi posto il codice

    //INIZIO CODICE
    #include <stdio.h>
    #include <stdlib.h>
    float val ;
    char prima_riga[100];
    float FX[10];
    float FA[10];
    float FB[10];
    float FC[10];
    float FD[10];
    int i =0;
    int a,b,c,d;
    int l_FX=0;
    int ind =0;

    int main ()
    {
    FILE *s;
    s = fopen("quasi2.txt", "r");

    /* controlla se il file viene aperto */
    if ((s = fopen("quasi2.txt", "r")) == NULL)
    {
    printf("Non posso aprire il file %s\n", "quasi2.txt");
    }


    fgets( prima_riga,50,s); // legge la prima riga del file


    printf(" la prima riga e': %s\n", prima_riga);


    while(fscanf(s,"%f",&val)!=EOF )
    {


    FX[i]=val; // riempie vettore FX
    printf ( "FX=%f\n", FX[i]);
    l_FX=i; // calcola l' ultimo indice pieno del vettore FX
    i++;
    }

    fclose(s);



    ind =0;
    a=0;
    while ( ind <= l_FX) // Riempimento FA
    {
    FA[a]=FX[ind];

    printf ( "FA=%f\n", FA[a]);
    a++;
    ind =ind+4;
    }


    printf ( "\n");
    ind =1;
    b=0;
    while ( ind <= l_FX) // Riempimento FB
    {
    FB[b]=FX[ind];

    printf ( "FB=%f\n", FB[b]);
    b++;
    ind =ind+4;

    }


    printf ( "\n");
    ind =2;
    c=0;
    while ( ind <= l_FX) // Riempimento FC
    {
    FC[c]=FX[ind];

    printf ( "FC=%f\n", FC[c]);
    c++;
    ind =ind+4;

    }


    printf ( "\n");
    ind =3;
    d=0;
    while ( ind <= l_FX) // Riempimento FD
    {
    FD[d]=FX[ind];

    printf ( "FD=%f\n", FD[d]);
    d++;
    ind =ind+4;

    }

    system("PAUSE");

    }

    // FINE CODICE

    Cosi tutto funziona e riesco a riempire i 4 array per colonna partento da un file cosi fatto:

    FA FB FC FD
    2.123 4.522 3.21 3.77
    3.441 5.663 7.55 8.93
    23.55 12.34 34.45 66.66
    21.345 18.234 12.99 23.44

    il dubbio è che il file che devo utilizzare è costitito da circa 400000 valori
    ( questo è solo un file di prova).
    Vi chiedo :
    viste le dimensioni elevate del file sarebbe opportuno cambiare la struttura del codice? per es usando dei puntatori ( vi chiedo perchè non ho tanta familiarità con questi concetti) .
    Potreste darmi dei consigli su come trattare in questo caso elevate quantità di valori?
    grazie mille.

  6. #6
    Originariamente inviato da aletrc
    viste le dimensioni elevate del file sarebbe opportuno cambiare la struttura del codice? per es usando dei puntatori ( vi chiedo perchè non ho tanta familiarità con questi concetti) .
    Potreste darmi dei consigli su come trattare in questo caso elevate quantità di valori?
    grazie mille.
    Premesso che bisognerebbe vedere se hai davvero bisogno di memorizzare tutti i valori, non puoi allocare un array a due dimensioni ed appena leggi un valore dal file piazzarlo già nella posizione giusta?

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Stai riaprendo lo stesso file due volte..
    Originariamente inviato da aletrc
    codice:
    ...
    ...
    
     int main ()
    {
        FILE *s;
        s = fopen("quasi2.txt", "r");
    
        /* controlla se il file viene aperto */
        if ((s = fopen("quasi2.txt", "r")) == NULL)
        {
            printf("Non posso aprire il file %s\n", "quasi2.txt");
        }
    
    ...
    ...
    Il codice giusto é:
    codice:
    ...
    ...
    
     int main ()
    {
        FILE *s;
        s = fopen("quasi2.txt", "r");
    
        /* controlla se il file viene aperto */
        if (s == NULL)
        {
            printf("Non posso aprire il file %s\n", "quasi2.txt");
        }
    
    ...
    ...

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9
    Grazie ragazzi per le risposte, ho snellito il codice, per come mi avete suggerito e sistemato la fopen.
    Purtroppo però il problema mi rimane.
    Mi sono costruito un file di circa 107000 valori per ogni colonna e fin qui tutto funziona.
    Se però raddoppio arrivando a 200000 circa il programma compila ,ma durante l'esecuzione mi da errore di windows .
    Ciò succede anche se uso meno valori ma dichiaro array di 150000 per esempio.
    avete consigli in merito?
    Per es è questo il caso in cui si deve allocare memoria dimamica?
    Grazie ancora.

  9. #9
    Originariamente inviato da aletrc
    Grazie ragazzi per le risposte, ho snellito il codice, per come mi avete suggerito e sistemato la fopen.
    Per cominciare, puoi postare il codice "snellito"?

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9
    Certo
    il codice snellito è il seguente:

    // INIZIO CODICE

    #include <stdio.h>
    #include <stdlib.h>
    float val ;
    char prima_riga[100];
    int sample=108000; // numero di campioni
    int i =0;
    int a=0,b=0,c=0,d=0;
    int l_FX=0;
    int ind =0;

    int main ()
    {

    float FA[sample];
    float FB[sample];
    float FC[sample];
    float FD[sample];
    FILE *s;

    s = fopen("quasi14.txt", "r");

    /* controlla se il file viene aperto */
    if (s == NULL)
    {
    printf("Non posso aprire il file %s\n", "quasi14.txt");
    }


    fgets( prima_riga,50,s); // legge la prima riga del file


    printf(" la prima riga e': %s\n", prima_riga);


    while(fscanf(s,"%f",&val)!=EOF ) // acquisisce da file e riempie i 4 array FA, FB, FC, FD
    {

    if (i==0|| i%4==0)
    {
    FA[a]= val;
    a++;
    }

    else if (i==1 || (i%4)-1==0)
    {
    FB[b]= val;
    b++;
    }

    else if (i==2 || (i%4)-2==0)
    {
    FC[c]= val;
    c++;
    }

    else if (i==3 || (i%4)-3==0)
    {
    FD[d]= val;
    d++;
    }

    i++;

    }



    printf ("lunghezza FA= %d\n",d);

    fclose(s);


    system("PAUSE");

    }

    // FINE CODICE

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.