PDA

Visualizza la versione completa : [C] ignorare righe file


sandrinolli
17-04-2010, 12:05
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.

oregon
17-04-2010, 13:21
Leggi le due righe e ignorale.

sandrinolli
17-04-2010, 14:31
Grazie ma potresti dirmi come potrei fare?

sandrinolli
17-04-2010, 14:48
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...

MItaly
17-04-2010, 15:16
Come ti è stato detto, leggi quei due valori (con una normale fscanf) e poi non usarli.

sandrinolli
17-04-2010, 15:24
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....

MItaly
17-04-2010, 15:31
To'; il tuo codice tra l'altro ha un errore per cui in matrice vengono memorizzati i dati in un'unica riga. Lo correggo.


#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":


#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.

sandrinolli
17-04-2010, 15:41
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?

sandrinolli
17-04-2010, 15:44
"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?

MItaly
17-04-2010, 16:03
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ì:


#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;
}

Loading