FILE BINARI e matrice statica

di il
5 risposte

FILE BINARI e matrice statica

Il problema che ho riscontrato è che nel file che ho aperto in modalità scrittura (wb) e nel quale vado a scrivere gli elementi (0 oppure 1) che ho caricato nella matrice statica non mi appare niente, o meglio, mi appare qualcosa ma non riesco a capire che c'è scritto......
allora ho dichiarato un altro puntatore a file che mi permette di aprire un altro file in modalità lettura, solo che in questo file non viene scritto nulla.....
quale potrrebbe essere il problema?
è possibile che non ho lavorato con la matrice statica?

Vi espongo il programma realizzato dal sottoscritto!!!

/*dichiarare una matrice quadrata statica nel main;
1. caricare in essa dei valori;
2. provare a scriverla in un file binario;
3. provare a leggerla dallo stesso file binario.*/

#include <stdio.h>
#include <stdlib.h>
#define RIGHE 5 /* righe della matrice */
#define COLONNE 5 /* colonne della matrice */

void carica (int, int);
int scrivi_in_file_binario (FILE *, int, int, int);
int leggi_su_file_binario (FILE *, int, int, int);

main()
{
int elementi_scritti = 0;
int elementi_letti = 0;
FILE *fpb1, *fpb2;
int matrice[RIGHE][COLONNE]; /* dichiarazione della matrice 5 X 5*/
int c; /* numero colonne effettivamente utilizzate */
int r; /* numero righe effettivamente utilizzate */

printf("ESERCITAZIONE\n\n");
printf("Dimmi quante righe vuoi utilizzare: ");
scanf("%d", &r);
printf("Dimmi quante colonne vuoi utilizzare: ");
scanf("%d", &c);

carica(r, c);

printf ("La dimensione della matrice e' %d!\n\n", sizeof(matrice));

fpb1 = fopen ("file_binario.dat", "wb");
if (fpb1 == NULL)
printf ("Non e' possibile scrivere su file!!!\n");
else
{
elementi_scritti = scrivi_in_file_binario (fpb1, matrice, r, c);
printf ("Gli elementi effettivamente scritti tramite la funzione fwrite() sono: %d\n\n", elementi_scritti);

rewind (fpb1);

fpb2 = fopen ("file_binario2.dat", "rb+");
if (fpb2 == NULL)
printf ("Non e' possibile leggere su file!\n");
else
{
elementi_letti = leggi_su_file_binario (fpb1, matrice, r, c);
printf ("Gli elementi effettivamente letti tramite la funzione fread() sono: %d\n\n", elementi_letti);
}
}
}

void carica(int A, int B)
{
int mat[RIGHE][COLONNE];
int i; /* indice per scorrere le righe */
int j; /* indice per scorrere le colonne */

for (i=0; i < A; i++)
for (j=0; j < B; j++)
{
printf ("Dammi l'elemento su riga [%d] colonna [%d]: ", i, j);
scanf ("%d", &mat[j]);
}
}

int scrivi_in_file_binario (FILE *A, int mat[][COLONNE], int B, int C)
{
int i, j;

for (i=0; i < B; i++)
{
for (j=0; j < C; j++)
{
fwrite (&mat, 4, B*C, A);
}
}

return sizeof (mat);
}

int leggi_su_file_binario (FILE *A, int mat[][COLONNE], int B, int C)
{
int i, j;

for (i=0; i < B; i++)
{
for (j=0; j < C; j++)
{
fread (mat, 4, B*C, A);
}
}

return sizeof (mat);
}

5 Risposte

  • Re: FILE BINARI e matrice statica

    Ho notato che la matrice che carichi con la procedura "carica" non carica (scusa la ripetizione) la matrice del main, ma quella locale dichiarata in "carica", quella del main che usi per scrivere su file risulta così vuota.
    Quindi dovresti passare come parametro a "carica" la matrice dichiarata nel main.

    Dopo di che il programma funziona (tolto qualche warning sulla dichiarazione dei parametri delle funzioni leggi_su_file_binario e scrivi_in_file_binario; per la matrice dovresti passare entrambe le dimensioni, cioè mat[RIGHE][COLONNE]); io l'ho provato ed è tutto ok, anche la lettura dal file che hai creato con la precedente scrittura funziona, prova a stampare a video la matrice che carichi in "leggi_su_file_binario", se è uguale a quella che avevi caricato vuol dire che è tutto ok; ovviamente se provi a leggere il file che hai creato con un editor ti escono caratteri strani
  • Re: FILE BINARI e matrice statica

    Grazie per i consigli.....
    io però vorrei capire bene le funzioni fwrite() e fread().....

    cioè sono la stessa cosa, rispettivamente, di fscanf() ed fprintf()?
    ammetto che sono a canoscenza che le due funzioni appena citate vengono utilizzate solo con file binari!!!!!
  • Re: FILE BINARI e matrice statica

    La fread e la fwrite sono funzioni per input e output un po' più a basso livello rispetto alla fprintf e la fscanf, in particolare:

    ti posto i prototipi delle due funzioni con la loro spiegazione, magari ti può essere utile.

    size_t fread(void* ptr, size_t size, size_t nobj, FILE* stream)
    Legge dal flusso stream al massimo nobj oggetti di dimensione size, e li memorizza nel vettore ptr; restituisce il numero di oggetti letti, che può risultare inferiore al numero richiesto.

    size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* stream)
    Scrive nobj oggetti di dimensione size dal vettore ptr sul flusso stream. Restituisce il numero di oggetti scritti, che risulta minore di nobj se si incorre in un errore.

    Penso che queste funzioni tu le possa usare anche per leggere/scrivere file non binari, in quanto non sono altro che una versione un po' più ad alto livello della read e write: in quest'ultime indichi il numero di byte da leggere o scrivere, mentre nella fread e fwrite puoi già indicare quanti oggetti da tot byte leggere caricando un array, o scrivere usando un array come fonte (come puoi notare, sono più evolute delle semplici read e write).

    Infine la fscanf e la fprintf ti permettono inoltre di specificare la formattazione dei dati in ingresso e in uscita, quindi come interpretare i byte che vengono estratti dal file o scritti in esso.

    Inoltre la fread, fwrite, fscanf, fprintf ti permettono di usare un determinato flusso di stream, che può essere un file oppure lo stdout, stdin o stderr

    boh, spero di essere stato utile, ciao
  • Re: FILE BINARI e matrice statica

    Sei stato molto chiaro e ti ringrazio!!!!
    ritornando sempre al programma che ti avevo esposto precendentemente, volevo chiederti: una volta aver aperto il "file_binario" in modalità scrittura "wb" e aver scritto al suo interno i valori <0 oppure 1> che avevo caricato nella matrice........ come faccio a leggere il contenuto del file e stampare a video i valori che corrispondono in verosimile a ciò che è contentuo nel file_binario?
  • Re: FILE BINARI e matrice statica

    Ti posto il tuo main() leggermente modificato dove alla fine faccio la stampa del contenuto di "matrice" che è stato caricata da "leggi_su_file_binario"
    main() 
    { 
    int elementi_scritti = 0; 
    int elementi_letti = 0; 
    FILE *fpb1, *fpb2; 
    int matrice[RIGHE][COLONNE]; /* dichiarazione della matrice 5 X 5*/ 
    int c; /* numero colonne effettivamente utilizzate */ 
    int r; /* numero righe effettivamente utilizzate */ 
    int i;
    int j;
    
    printf("ESERCITAZIONE\n\n"); 
    printf("Dimmi quante righe vuoi utilizzare: "); 
    scanf("%d", &r); 
    printf("Dimmi quante colonne vuoi utilizzare: "); 
    scanf("%d", &c); 
    
    carica(matrice,r, c); 
    
    printf ("La dimensione della matrice e' %d!\n\n", sizeof(matrice)); 
    
    fpb1 = fopen ("file_binario", "wb"); 
    if (fpb1 == NULL) 
    	printf ("Non e' possibile scrivere su file!!!\n"); 
    else 
    { 
    	elementi_scritti = scrivi_in_file_binario (fpb1, matrice, r, c); 
    	printf ("Gli elementi effettivamente scritti tramite la funzione fwrite() sono: %d\n\n", elementi_scritti); 
    	
    	rewind (fpb1); 
    	
    	fpb2 = fopen ("file_binario", "rb+"); 
    	if (fpb2 == NULL) 
    	printf ("Non e' possibile leggere su file!\n"); 
    	else 
    	{ 
    	elementi_letti = leggi_su_file_binario (fpb1, matrice, r, c); 
    	printf ("Gli elementi effettivamente letti tramite la funzione fread() sono: %d\n\n", elementi_letti); 
    	
    	
    	for(i=0;i<r;i++){
    		for(j=0;j<c;j++){
    			printf("%d",matrice[i][j]);
    		}
    		printf("\n");
    	}
    	} 
    } 
    } 
Devi accedere o registrarti per scrivere nel forum
5 risposte