Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22

    [C] Acquisire da file una matrice quadrata

    Ciao!
    Dato un file che contiene una serie di righe che contengono solo numeri interi separati da uno spazio, tipo nel formato:
    "
    210 630 22 102 435
    240 500 35 923 234
    0 611 152 883 238
    14 57 64 613 846
    96 635 856 535 22
    "

    e data una costante N definita a priori, vorrei estrapolare dal file una matrice quadrata di ordine N:
    per esempio, con N = 4 e con quel file, la mia matrice deve essere
    "
    210 630 22 102
    240 500 35 923
    0 611 152 883
    14 57 64 613


    "
    Ecco, sapendo per esempio che N = 4 e che il file contenga soltanto gli elementi utili per la mia matrice potrei benissimo farlo con un'istruzione del tipo

    i=0;
    while(fgets(riga, RIGA, fr) != NULL)

    {

    sscanf(riga, "%d %d %d %d", &matrice[i][0], &matrice[i][1], &matrice[i][2], &matrice[i][3]);

    p = sscanf(riga, "%d %d %d %d", &matrice[i][0], &matrice[i][1], &matrice[i][2], &matrice[i][3]);


    if(p != N)

    {
    printf("ERRORE - formato del file non corretto");

    exit(4);

    }

    i++;


    }


    1° problema)

    Ma così facendo, per esempio, se cambio il valore di N e metto N = 5 devo andare a modificare tutto il codice e aggiungere un altro "&matrice[i][4]", per cui questa istruzione è molto scomoda se voglio per esempio digitare il valore di N da tastiera (ammesso che voglio prendere tutte le righe dal file!)!

    2° problema)

    La funzione "sscanf" mi "scannerizza" l'intera riga del file e per ogni nuova riga parte dall'inizio ( ovvero sarebbe una sciocchezza scrivere
    "
    for(i=0; i<N; i++)
    for(j=0; j<N; j++)
    sscanf(riga[i][j], "%d", &matrice[i][j]);
    "

    , anche perché c'ho già provato e smette di funzionare tutto).

    Allora, la mia domanda è:

    dato un file formato da una serie di righe contenenti numeri interi ognuno separati da uno spazio, è possibile, man mano che si legge dal file un numero per volta, allocarli in una matrice quadrata di ordine N? o di ordine n (con n una costante acquisita da tastiera al momento dell'esecuzione)?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Data una riga

    i

    questo ciclo legge i dati delle N colonne della riga

    codice:
    	char *tmp=riga;
    	for (int j=0; j<N; j++)
    	{
    		sscanf(tmp++, "%d", &matrice[i][j]);
    		while(*tmp && (*tmp)!=' ') tmp++;
    	}
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Data una riga

    i

    questo ciclo legge i dati delle N colonne della riga

    codice:
        char *tmp=riga;
        for (int j=0; j<N; j++)
        {
            sscanf(tmp++, "%d", &matrice[i][j]);
            while(*tmp && (*tmp)!=' ') tmp++;
        }
    ________________________
    Scusa l'ignoranza...dove devo usare il ciclo? devo usare fgets o fgetc, prima del for, con while?
    "riga" è una costante char da definire prima di "*tmp = riga" o una stringa?
    Ho scritto una cosa del genere

    #include <stdio.h>
    #include <stdlib.h>
    #define N 4


    int main ()
    {
    char riga;
    char *tmp=riga
    int matrice[N][N], f, i , j;

    FILE *fr;
    fopen("file.txt", "r");
    fr = fopen("file.txt", "r");


    i=0;
    while(i<N)
    {
    fgetc(riga);


    for (j=0; j<N; j++)
    {
    sscanf(tmp++, "%d", &matrice[i][j]);
    while(*tmp && (*tmp)!=' ')
    tmp++;
    }
    i++;
    }
    fclose(fr);

    return 0;
    }

    Ma non funziona , tant'è vero che il programma non parte neanche! potresti essere più specifico per favore? è da pochissimo tempo che studio il linguaggio c

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma scusa, perché questo problema? Avevi scritto nel primo post

    while(fgets(riga, RIGA, fr) != NULL)

    Adesso perché parli di fgetc ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Ma scusa, perché questo problema? Avevi scritto nel primo post

    while(fgets(riga, RIGA, fr) != NULL)

    Adesso perché parli di fgetc ?
    si hai ragione scusami, ma come avevo detto studio da poco il c e non mi sono chiare alcune istruzioni, per esempio "sscanf(tmp++, "%d", &matrice[i][j]);" pensavo che la sscanf si usasse solo in corrispondenza di una stringa e in conoscenza dei campi da riempire e non ne conoscevo assolutamente l'utilizzo tramite puntatore, e visto che non l'hai scritto non ne comprendevo il senso, per questo mi chiedevo se prima del for ci stava una fgetc perché dal punto di vista sintattico viene usata per prelevare un carattere alla volta e mi sembrava molto più plausibile che lo avessi sottinteso, tra l'altro mi è ancora sconosciuto l'utilizzo dei puntatori, in pratica hai assegnato a tmp l'indirizzo del vettore riga[RIGA], che corrisponde all'indirizzo del suo primo elemento, e man mano spostandolo con tmp++, sposti l'indirizzo all'elemento successivo di riga[RIGA] così facendo che la sscanf appena preleva un intero di ferma, ignorando gli spazi con
    "
    while(*tmp && (*tmp)!=' ') tmp++;
    "
    l'ho capito solo adesso!! Ma comunque sia ho riscritto il codice corretto come hai detto tu in codeblocks e non funziona, benchè dal file mi ricava correttamente soltanto la prima riga.


    Questo è il file "file.txt":


    Questo è il codice che ho scitto in codeblocks:
    "
    #include <stdio.h>#include <stdlib.h>
    #define N 4
    #define RIGA 100


    int main ()
    {
    char riga[RIGA];
    char *tmp=riga;
    int matrice[N][N], f, i , j;


    FILE *fr;
    fopen("file.txt", "r");
    fr = fopen("file.txt", "r");

    i=0;
    while(fgets(riga, RIGA, fr) != NULL)
    {
    for (j=0; j<N; j++)
    {
    sscanf(tmp++, "%d", &matrice[i][j]);

    while(*tmp && (*tmp)!=' ')

    tmp++;
    }

    i++;

    }

    fclose(fr);



    for(i=0; i<N; i++)
    {
    for(j=0; j<N; j++)
    printf("%d ", matrice[i][j]);


    printf("\n");
    }


    return 0;
    }
    "

    Questo è l'output:
    output.jpg
    Ultima modifica di rino95; 25-01-2016 a 22:36

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Hai fatto qualche errore ... ti mostro le correzioni ...

    P.S. Devi usare i tag CODE per mostrare il codice e lo devi indentare altrimenti non si capisce nulla ...

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    #define N 5            // La matrice nel file e' 5x5
    #define RIGA 100
    
    
    int main ()
    {
        char riga[RIGA];
        int matrice[N][N], i, j;  // f non e' utilizzata
        
        FILE *fr = fopen("file.txt", "r");  // La fopen va fatta una sola volta
    
    
        i=0;
        while(fgets(riga, RIGA, fr) != NULL)
        {
            char *tmp=riga;        // Questa deve essere assegnata ad ogni nuova riga
            for (j=0; j<N; j++)
            {
                sscanf(tmp++, "%d", &matrice[i][j]);
                while(*tmp && (*tmp)!=' ') tmp++;
            }
    
    
            i++;
        }
    
    
        fclose(fr);
        
        for(i=0; i<N; i++)
        {
            for(j=0; j<N; j++)
                printf("%d ", matrice[i][j]);
    
    
            printf("\n");
        }
        
        return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    In alternativa, se non devi usare la fgets leggendo tutta la riga, puoi leggere i singoli valori, molto più semplicemente così

    codice:
    	FILE *fr = fopen("file.txt", "r"); 
    
    
    	for(i=0; i<N; i++)
    		for(j=0; j<N; j++)
    			fscanf(fr, "%d", &matrice[i][j]);
    
    
    	fclose(fr);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22
    Allora il puntatore va dichirato ad ogni nuova riga? Adesso ho capito come mai mi veniva giusta soltanto la prima !! scusa ancora se sono stato così di coccio ma i puntatori proprio non sapevo come usarli Ti ringrazio veramente sei stato molto paziente!!!

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Lo puoi dichiarare anche una sola volta ma il suo valore va aggiornato ad ogni nuova riga perché varia nel ciclo. Guarda anche la seconda soluzione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.