Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 41
  1. #1

    [C] ignorare righe file

    Salve ragazzi,
    avrei bisogno di una mano...
    Devo caricare un file che contiene una matrice e devo assegnare i valori di quest ultima ad un'altra.
    Il file però nella prima e seconda riga contiene rispettivamente 2 valori interi e solo dalla terza riga inizia ad esserci la matrice.
    Come potrei ignorare queste 2 righe del file dopo averlo aperto?
    Spero di essere stata chiara...
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Leggi le due righe e ignorale.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Grazie ma potresti dirmi come potrei fare?

  4. #4
    Mi spiego meglio...Il file da caricare è "tdm.dat" e ha qst struttura :

    2
    255
    13 0 11................................................ ................................................
    2 1 0 6 .................................................. ..........................................

    Le prime 2 righe indicano la dim della matrice[2][255]....
    Io devo pero solo caricare la matrice.
    Ho scritto questo codice...Dove sbaglio?

    #define N 2
    #define M 255

    int matrice [N][M];
    File* infile;
    int i = 0;
    int j = 0;

    infile = fopen("tdm.dat","r");
    while(fscanf(infile,"%d",&matrice[i][j])!=EOF)
    {
    printf("%d",matrice[i][j]);
    j++;
    }

    Facendo il debug ho notato che la matrice viene riempita ma vengono inclusi i valori presenti nelle prime due righe del file...

  5. #5
    Come ti è stato detto, leggi quei due valori (con una normale fscanf) e poi non usarli.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Ma potreste magari fare riferimento al codice in modo che io possa capire?
    La prima riga della matrice invece di avere com e primi valori 13 e 0 , ha 2 e 255....

  7. #7
    To'; il tuo codice tra l'altro ha un errore per cui in matrice vengono memorizzati i dati in un'unica riga. Lo correggo.
    codice:
    #define N 2
    #define M 255
    
    int matrice [N][M];
    File* infile;
    int i = 0;
    int j = 0;
    int dummy;
    
    infile = fopen("tdm.dat","r");
    /* leggi i primi due valori senza poi utilizzarli */
    fscanf(infile, "%d", &dummy);
    fscanf(infile, "%d", &dummy);
    while(fscanf(infile,"%d",&matrice[i][j])!=EOF)
    {
        printf("%d",matrice[i][j]);
        j=(j+1)%N;
        if(j==0)
            i++;
    }
    In realtà poi la fscanf consente anche una sintassi particolare per leggere e ignorare senza usare variabili "inutili":
    codice:
    #define N 2
    #define M 255
    
    int matrice [N][M];
    File* infile;
    int i = 0;
    int j = 0;
    
    infile = fopen("tdm.dat","r");
    /* leggi i primi due valori senza poi utilizzarli */
    fscanf(infile, "%*d %*d");
    while(fscanf(infile,"%d",&matrice[i][j])!=EOF)
    {
        printf("%d",matrice[i][j]);
        j=(j+1)%N;
        if(j==0)
            i++;
    }
    In ogni caso anche così il tuo codice è potenzialmente a rischio di buffer overflow, dovresti terminare il ciclo, oltre che all'EOF, anche se finisce la matrice.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Grazie mille...Avevo fatto nel primo modo,ma volevo una conferma...Per quanto riguarda la sintassi particolare della fscanf,non la conoscevo e ti rimgrazio tanto..

    Ora se volessi k le costanti N ed M acquisissero automaticamente il loro valore a seconda della dimensione della matrice che leggo dal file tdm.dat(prime 2 righe),come potrei fare?
    Cioe la matrice presente nel file tdm.dat puo avere differenti dimensioni...Io nn vorrei dover manualmente modificare di volta in volta il valore di N ed M ma vorrei che si assegnasse automaticamente ...Si potrebbe fare?

  9. #9
    "In ogni caso anche così il tuo codice è potenzialmente a rischio di buffer overflow, dovresti terminare il ciclo, oltre che all'EOF, anche se finisce la matrice."

    Non avevo letto questa parte...E quindi come dovrei fare?

  10. #10
    Originariamente inviato da sandrinolli
    Cioe la matrice presente nel file tdm.dat puo avere differenti dimensioni...Io nn vorrei dover manualmente modificare di volta in volta il valore di N ed M ma vorrei che si assegnasse automaticamente ...Si potrebbe fare?
    Certo che si può, ma in tal caso devi allocare la matrice nell'heap tramite malloc, e l'accesso ad essa diventa leggermente differente (anche se potresti considerarla come un singolo vettore 1x(N*M) durante il caricamento per comodità).
    "In ogni caso anche così il tuo codice è potenzialmente a rischio di buffer overflow, dovresti terminare il ciclo, oltre che all'EOF, anche se finisce la matrice."

    Non avevo letto questa parte...E quindi come dovrei fare?
    Ad esempio così:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int * matrice;
        int i,j;
        FILE * inFile;
        int width=0, height=0;
    
        inFile = fopen("tdm.dat","r");
        if(inFile==NULL)
        {
            fputs("Impossibile aprire il file.\n",stderr);
            return EXIT_FAILURE;
        }
        /* Leggi i valori di larghezza e altezza */
        if(fscanf(inFile, "%d %d", &width, &height)!=2)
        {
            fputs("Impossibile leggere le dimensioni dell'array dal file.\n",stderr);
            fclose(inFile);
            return EXIT_FAILURE;
        }
        /* Alloca la memoria necessaria */
        matrice=malloc(sizeof(*matrice)*width*height);
        if(matrice==NULL)
        {
            fputs("Impossibile allocare la memoria per l'array.\n",stderr);
            fclose(inFile);
            return EXIT_FAILURE;
        }
        /* Leggi i valori dalla matrice, considerandola come un vettore di lunghezza width*height
        for(i=0; i<width*height; i++)
        {
            if(fscanf("%d", &array[i])!=1)
            {
                fputs("Il file non contiene abbastanza dati.\n",stderr);
                fclose(inFile);
                return EXIT_FAILURE;
            }
        }
        /* Visualizza i vettori della matrice, considerandola ora come una matrice di larghezza width e altezza height
        for(i=0; i<height; i++)
        {
            for(j=0; j<width; j++)
                printf("matrice[%d][%d]=%d", i, j, matrice[i*width+j]);
        }
        return EXIT_SUCCESS;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

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.