PDA

Visualizza la versione completa : [C] Scrittura lettera indesiderata in output su file di testo


Binni
29-09-2012, 17:17
Ciao ragazzi, ho un problema con la scrittura su di un file.

void writeFile(FILE * fd,int * m)
{
int i=0;
char a[20][20];
char b[20][20];
int c;
fd = fopen("lol.txt","w");
if (fd == NULL)
{
printf("Impossibile aprire file!");
exit(1);
}
else
{
while ( i != 'n')
{

scanf("%s %s %d",&a,&b,&c);
fprintf(fd,"%s %s %d\n",a,b,c);
printf("Vuoi aggiungere un altro elemento?s/n");
scanf("%c",&i);
m+=1;
}
}
fclose(fd);
}

Il primo rigo sul file viene scritto correttamente, nel secondo inserisce la "s" di condizione per continuare con il while..mi suggerite un metodo per risolvere questo problema?
Grazie!

CyberCrasher
29-09-2012, 17:31
C'è un errore di dichiarazione della variabile 'i'. Dovresti dichiararla di tipo char.

oregon
29-09-2012, 18:26
E poi devi pulire il buffer di input della tastiera subito dopo ogni scanf.

c0der
29-09-2012, 19:04
C'è anche l'errore nella dichiarazione di "a" e "b":
char a[20][20];
char b[20][20];
sono array di stringhe.
Dovevi scrivere:
char a[20];
char b[20];
o ancora più semplicemente:
char a[20], b[20];

e poi una scanf scritta così:
scanf("%20s %20s %d", a, b, &c);

per evitare buffer overflow.

Ciao.

Binni
29-09-2012, 19:19
Originariamente inviato da CyberCrasher
C'è un errore di dichiarazione della variabile 'i'. Dovresti dichiararla di tipo char.
Errore mio, avevo provato con un contatore ed avevo lasciato come intero :D



Originariamente inviato da oregon
E poi devi pulire il buffer di input della tastiera subito dopo ogni scanf.
Con "fflush(stdin)" giusto??



Originariamente inviato da c0der
e poi una scanf scritta così:
scanf("%20s %20s %d", a, b, &c);

Ciao.
Mi spiegheresti a che serve?

oregon
29-09-2012, 19:23
Originariamente inviato da Binni
Con "fflush(stdin)" giusto??

Oppure, meglio, con

while(getchar ()!='\n')



Mi spiegheresti a che serve?

A limitare il numero di caratteri inseriti nelle stringhe per evitare di andare oltre la loro dimensione.

Ma ti consiglio di studiarle queste cose ... leggi questo

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

Binni
29-09-2012, 19:38
Grazie mille ragazzi!
:D

oregon
29-09-2012, 19:45
In realtà dovresti scrivere

scanf("%19s %19s %d", a, b, &c);

dato che si deve considerare il terminatore.

c0der
29-09-2012, 20:56
Originariamente inviato da oregon
In realtà dovresti scrivere

scanf("%19s %19s %d", a, b, &c);

dato che si deve considerare il terminatore.

Assolutamente sì, vero, dimenticanza mia. Ciao.

Loading