PDA

Visualizza la versione completa : [C] salvare matrice in un file


milu
25-07-2012, 17:06
ciao a tutti!!
devo scrivere un programma che legga in input due matrici, calcoli la matrice somma e la salvi all'interno di un file testo..
io l'ho fatto..o almeno credo di averlo fatto..ed è proprio questo che vi chiedo è giusto quello che ho scritto? :shy:



#include<stdio.h>
#include<iostream>

/*definizione costanti simboliche*/

#define MAXRIGHE 20
#define MAXCOLONNE 30

main()
{


int nrighe;
int ncolonne;

/*definizione di array bidimensionali*/
int a[MAXRIGHE][MAXCOLONNE], b[MAXRIGHE][MAXCOLONNE], c[MAXRIGHE][MAXCOLONNE];

/*definizione di prototipi di funzioni*/
void ingresso(int a[][MAXCOLONNE], int nrighe, int ncolonne);
void somma(int a[][MAXCOLONNE],int b[][MAXCOLONNE],int c[][MAXCOLONNE], int nrighe, int ncolonne);
void uscita(int c[][MAXCOLONNE], int nrighe, int ncolonne);

/*lettura e scrittura tabella di numeri "a" e "b"*/
printf("di quante righe si compone la tabella? ");
scanf("%d", &nrighe);
printf("e di quante colonne? ");
scanf("%d", &ncolonne);

printf("la tabella 'a' e' la seguente:\n");
ingresso (a,nrighe,ncolonne);

printf("la tabella 'b' e' la seguente: \n");
ingresso (b,nrighe,ncolonne);

somma(a,b,c,nrighe,ncolonne);


/*effettuata l'operazione ottengo la tabella "c"*/
printf("la somma degli elementi di ciascuna tabella ci da la seguente tabella 'c': \n" );
uscita(c,nrighe,ncolonne);

}

/*legge la prima tabella di numeri*/
void ingresso(int a[][MAXCOLONNE], int m, int n)

{
int riga, colonna;

for(riga=0; riga<m; ++riga){
printf("inserisci i dati per la riga numero %2d|n", riga+1);
for(colonna=0;colonna<n;++colonna)
scanf("%d", &a[riga][colonna]);
}
return;
}
/*somma gli elementi della prima tabella a quelli della seconda tabella*/
void somma(int a[][MAXCOLONNE], int b[][MAXCOLONNE],int c[][MAXCOLONNE], int m, int n)
{
int riga, colonna;
for(riga=0;riga<m;++riga)
for(colonna=0;colonna<n;++colonna)
c[riga][colonna]= a[riga][colonna] + b[riga][colonna];
return;
}

/*scrive la tabella somma,ossia "c"*/
void uscita(int c[][MAXCOLONNE],int m, int n)
{
FILE *ftp;
int riga, colonna;
for(riga=0; riga<m;++riga){
for(colonna=0;colonna<n;++colonna)
printf("%4d", c[riga][colonna]);
printf("\n");
}
ftp=fopen("sample.dat", "w");
fprintf(ftp,"%4d", c[riga][colonna]);
fclose(ftp);
system("PAUSE");
return;
}



pongo questa domanda perchè per me è come se non avessi creato il file dove porre la matrice somma..almeno visivamente, quando compilo non mi pare :facepalm:
grazie a tutti

oregon
25-07-2012, 17:17
1) i prototipi delle funzioni non si mettono all'interno del main ma fuori

2) nella funzione uscita i cicli visualizzano i dati ma non li scrivono nel file. Tra la fopen e la fclose ci sta solo una fprintf (e sbagliata) mentre ci dovrebbero essere i cicli ...

milu
25-07-2012, 17:45
la fprintf dovrebbe essere corretta così..
giusto?




fprintf(ftp,"%4d", riga, colonna);



poi mettendo tra la fopen e la fclose i cicli ho modificato in questa maniera



void uscita(int c[][MAXCOLONNE],int m, int n)
{
FILE *ftp;
int riga, colonna;
ftp=fopen("sample.dat", "w");
for(riga=0; riga<m;++riga){
for(colonna=0;colonna<n;++colonna)
printf("%4d", c[riga][colonna]);
printf("\n");
}

fprintf(ftp,"%4d", riga, colonna);

fclose(ftp);
system("PAUSE");
return;
}

non capisco però,credo che continuo a sbagliare qualcosa..metto o non metto la fprintf il risultato e quindi la matrice somma ce l'ho ugualmente..
e quindi in questo caso è inutile mettere la fprinf perchè ho già le printf? o sto continuando a non mettere la matrice nel file?

oregon
25-07-2012, 17:56
Guarda che è semplice, ma ti devi concentrare un attimo ...

1) per inviare i dati al file devi usare esclusivamente le fprintf (le printf si usano per il video, ma non è questo il caso dato che devi scrivere su file e non su video); quindi, non ci devono essere printf ma solo fprintf

2) se scrivi

fprintf(ftp,"%4d", riga, colonna);

non fai altro che mandare su file il valore della variabile riga e non i dati della matrice

Per inviare i dati della matrice dovrai inviare il valore di c e quindi

fprintf("%4d", c[riga][colonna]);

all'interno dei cicli

P.S. La system("PAUSE"); alla fine non serve

milu
25-07-2012, 18:13
quindi di fondo quando compilo non vedo niente?
devo fare questo


void uscita(int c[][MAXCOLONNE],int m, int n)
{
FILE *ftp;
int riga, colonna;
ftp=fopen("sample.dat", "w");
for(riga=0; riga<m;++riga){
for(colonna=0;colonna<n;++colonna);
}

fprintf(ftp,"%4d",c[riga][colonna]);
fclose(ftp);
system("PAUSE");
return;
}

però credo che la fprintf deve essere così

fprintf(ftp,"%4d",c[riga][colonna])
altrimenti il compilatore mi da errore dicendo che nelle fprintf manca FILE* cioè ftp..

oregon
25-07-2012, 18:17
Originariamente inviato da milu
quindi di fondo quando compilo non vedo niente?

Ma che vuoi vedere durante la compilazione?

Tu sai cosa vuol dire compilare?

Devi eseguire il codice per capire se funziona e se ci sono problemi ...



devo fare questo

Certo che la fprintf deve essere in quel modo (vedi di studiare la documentazione sulla fprintf ...).

Ma deve stare all'interno del secondo ciclo for ... fai attenzione alle parentesi { } dei cicli perché attualmente la fprintf è fuori dai cicli ...

milu
25-07-2012, 18:36
inizialmente avevo scritto la fprinf in quel modo e avevi detto che era sbagliata credevo fosse scritta male..non credevo che l'errore fosse nel fatto che non era nei cicli..
cmq quando faccio partire il run(sbagliavo a dire quando compilo),
io inserisco da tastiera le due matrici a, b e la matrice c alla fine non la vedo..

oregon
25-07-2012, 19:42
Originariamente inviato da milu
inizialmente avevo scritto la fprinf in quel modo e avevi detto che era sbagliata

No ... fai attenzione alle risposte ... avevo scritto che questa

fprintf(ftp,"%4d", riga, colonna);

era sbagliata e che quello che dovevi usare era questa

fprintf("%4d", c[riga][colonna]);

e nel ciclo.


io inserisco da tastiera le due matrici a, b e la matrice c alla fine non la vedo..

Non la vedi aprendo il file ... giusto?

E hai corretto il codice come ti ho detto o no?

milu
25-07-2012, 20:00
ho modificato così


void uscita(int c[][MAXCOLONNE],int m, int n)
{
FILE *ftp;
int riga, colonna;
ftp=fopen("sample.dat", "w");
if(ftp){
for(riga=0; riga<m;++riga){
for(colonna=0;colonna<n;++colonna)
fprintf(ftp,"%4d",c[riga][colonna]);
}
fclose(ftp);
}
else
printf("errore durante l'apertura del file");
system("PAUSE");
return;
}
e poichè non mi dice errore durante l'apertura del file, dovrebbe essere fatta bene..giusto?

oregon
25-07-2012, 20:09
Scrivila così




void uscita(int c[][MAXCOLONNE],int m, int n)
{
FILE *ftp;
int riga, colonna;

ftp=fopen("sample.dat", "w");

if(ftp)
{
for(riga=0; riga<m;++riga)
{
for(colonna=0;colonna<n;++colonna)
fprintf(ftp, "%4d ",c[riga][colonna]);

fprintf(ftp, "\n");
}

fclose(ftp);
}
else
printf("errore durante l'apertura del file");

return;
}


in modo che ci siano degli spazi tra i dati e che questi siano organizzati in linee.

Inoltre, in questo modo il codice è più chiaro ...

Se funziona o no, infine, dovresti saperlo aprendo il file sample.dat che il programma ha scritto ... lo hai mai fatto?

Loading