PDA

View Full Version : funzione in C con un file csv in output


antimon
13-06-2007, 16:41
ciao...sto cercando di creare una funzione in C che dia in output un file csv partendo da una matrice interna al programma


void creazione() {
FILE *fl;
int i,j;
fl=fopen("out.csv","a+");
for (i=0;i<X;++i) {
char *vex=(char *)malloc(2000*sizeof(char *));
for (j=0;j<Y;j++) {
strcat(vex,mat[i][j]);
strcat(vex,",");
}
fputs(vex, fl);
free(vex);
}
fclose(fl);
}


se ad esempio la matrice fosse:

1 2 3
4 5 6

l'output dovrebbe essere:

1,2,3
4,5,6

e invece esce questa schifezza:

x=1,2,3
,x=4,5,6
,


ciao e grazie per l'aiuto!!!

andbin
13-06-2007, 16:47
void creazione() {
FILE *fl;
int i,j;
fl=fopen("out.csv","a+");
for (i=0;i<X;++i) {
char *vex=(char *)malloc(2000*sizeof(char *));
for (j=0;j<Y;j++) {
strcat(vex,mat[i][j]);
strcat(vex,",");
}
fputs(vex, fl);
free(vex);
}
fclose(fl);
}
Innanzitutto immagino che mat[i][j] denoti un puntatore a char (altrimenti non avrebbe senso).

Poi comunque non servirebbe nemmeno allocare memoria. Tra l'altro, tu allochi memoria ma non la inizializzi. strcat si aspetta di trovare una stringa terminata dal nullo a cui accodare la nuova stringa.

Ti conviene usare delle semplici fprintf.

tglman
13-06-2007, 16:50
perche nn provi a fare cosi ;) ti togli parecchie brighe:

void creazione() {
FILE *fl;
int i,j;
fl=fopen("out.csv","a+");
for (i=0;i<X;++i) {
for (j=0;j<Y;j++) {
fprintf("%i",mat[i][j]);
if(j<Y)fprintf("%s",",");
}
fprintf("%s","\n\r");
}
fclose(fl);
}


sono partito dal presupposto che la matrice sia di interi altrimenti ecco la reference:
http://www.cplusplus.com/reference/clibrary/cstdio/fprintf.html

antimon
13-06-2007, 17:27
la matrice č di puntatori a stringhe e non conosco le dimensioni delle stringhe. la matrice č stata creata da un file csv in input allocando memoria con malloc

antimon
13-06-2007, 17:59
ho seguito le indicazioni di tglman inserendo questo codice:

void creazione() {
FILE *fl;
int i,j;
fl=fopen("out.csv","a+");
for (i=0;i<X;++i) {
for (j=0;j<Y;j++) {
fprintf(fl, "%s",mat[i][j]);
if(j<Y)fprintf(fl,"%s",",");
}
fprintf(fl,"%s","\n\r");
}
fclose(fl);
}

funziona tranno che per la virgola:

1,2,3
,
4,5,6
,

andbin
13-06-2007, 20:03
funziona tranno che per la virgola:

1,2,3
,
4,5,6
,
Nei file csv, dopo l'ultimo valore sulla riga non c'č la virgola (almeno cosė mi sembra di ricordare ....).

Ti conviene farlo cosė:
for (i=0;i<X;++i) {
for (j=0;j<Y;j++) {
fprintf(fl, "%s", mat[i][j]);
if (j<Y-1)
fprintf(fl, ",");
}

fprintf (fl, "\n");
}
Comunque visto l'output che hai postato, molto probabilmente c'č un \n di troppo nella stringa all'ultima colonna dell'array. Da dove ti arrivano le stringhe che hai nell'array?

antimon
13-06-2007, 21:35
Nei file csv, dopo l'ultimo valore sulla riga non c'č la virgola (almeno cosė mi sembra di ricordare ....).

Ti conviene farlo cosė:
for (i=0;i<X;++i) {
for (j=0;j<Y;j++) {
fprintf(fl, "%s", mat[i][j]);
if (j<Y-1)
fprintf(fl, ",");
}

fprintf (fl, "\n");

}
Comunque visto l'output che hai postato, molto probabilmente c'č un \n di troppo nella stringa all'ultima colonna dell'array. Da dove ti arrivano le stringhe che hai nell'array?

provando e riprovando sono riuscito a risolvere cosė:
void creazione() {

FILE *fl;

int i,j;

fl=fopen("out.csv","a+");

for (i=0;i<X;++i) {

for (j=0;j<Y;j++) {

fprintf(fl, "%s",mat[i][j]);

if(j<(Y-1))fprintf(fl, ",");

}

}

fclose(fl);

}

GRAZIE DELL'AIUTO!!!!!!