PDA

Visualizza la versione completa : [C] Inserire dati su un file e lettura


goatboy
22-07-2011, 09:36
Salve a tutti. Ho scritto un semplice programma che permette l'inserimento di 4 tipi di dati su un file:
1) Username
2) Password
3) Email
4) EtÓ
Il problema funziona, ma se inserisco un username con lo spazio (es. "Goat Boy"), mi salta direttamente ad Email, senza farmi dare la password. Come mai?
Questo Ŕ il codice che ho scritto:


#include <stdio.h>
#include <stdlib.h>
#define USER_FILE "user.txt"

typedef struct{
char user[30];
char pass[30];
char email[50];
int age;
} user;

int main(void){
FILE *fp;
user u;
if (!(fp=fopen(USER_FILE,"a"))){
printf("Errore\n");
exit(1);
}
printf ("Inseririmento di un nuovo utente: \n\n");
printf ("Username: ");
scanf ("%s",u.user);
printf ("Password: ");
scanf ("%s",u.pass);
printf ("Email: ");
scanf ("%s",u.email);
printf ("EtÓ: ");
scanf ("%d",&u.age);

/* Scrivo i dati sul file */
fprintf(fp, "%s\t%s\t%s\t%d\n", u.user, u.pass, u.email, u.age);
printf("Dati scritti con successo\n");
fclose(fp);
}


Inoltre vorrei sapere una cosa sulla lettura dei file. Ieri ho creato un file .txt con scritti dei numeri, e poi ho creato un programma che mi leggeva ci˛ che era scritto sul file. Vorrei sapere come mai non mi da i numeri sullo schermo, forse devo scriverli in modo particolare sul file .txt? O ho sbagliato il codice (cosa molto probabile)?


#include <stdio.h>
#include <stdlib.h>
#define MIO_FILE "prova.txt"

int main(void){
FILE *fp;
fp=fopen(MIO_FILE, "r");
int fclose(FILE *fp);
}


Ringrazio giÓ da ora per la vostra disponibilitÓ :)

goatboy
22-07-2011, 17:11
Nessuno sa darmi una mano, io ho provato a cercare su qualche guida, ma non sono riuscito a trovare una soluzione al problema..

clynamen
22-07-2011, 18:18
In teoria si potrebbe risolvere il problema, ma usare scanf() Ŕ estremamente pericoloso (vedi buffer overflow & co).
Quindi Ŕ meglio usare altre funzioni come fgets().

Per quanto riguarda il secondo problema devi usare atoi()
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Celebron
22-07-2011, 18:25
la scanf %s funziona cosý:

String of characters. This will read subsequent characters until a whitespace is found (whitespace characters are considered to be blank, newline and tab).

per cui si ferma appena trova anche un carattere di spaziatura

goatboy
22-07-2011, 22:05
Originariamente inviato da clynamen
In teoria si potrebbe risolvere il problema, ma usare scanf() Ŕ estremamente pericoloso (vedi buffer overflow & co).
Quindi Ŕ meglio usare altre funzioni come fgets().

Non riesco a capire come funziona la fgets, puoi farmi un esempio?

goatboy
22-07-2011, 22:06
Originariamente inviato da Celebron
la scanf %s si ferma appena trova anche un carattere di spaziatura
Non lo sapevo, di sicuro non lo dimentico pi¨ :dh˛:

goatboy
22-07-2011, 22:08
Come dovrei modificare il codice che ho? Al posto di scanf devo inserire fgets , ma che parametri devo dare alla fgets?
Io ho trovato :


char *fgets(char *s, int size, FILE *stream);


Ma non s˛ a cosa si riferiscono int size e FILE *stream..

Celebron
22-07-2011, 23:03
Originariamente inviato da goatboy
Come dovrei modificare il codice che ho? Al posto di scanf devo inserire fgets , ma che parametri devo dare alla fgets?
Io ho trovato :


char *fgets(char *s, int size, FILE *stream);


Ma non s˛ a cosa si riferiscono int size e FILE *stream..


ecco:

arameters
str
Pointer to an array of chars where the string read is stored.
num
Maximum number of characters to be read (including the final null-character). Usually, the length of the array passed as str is used.
stream
Pointer to a FILE object that identifies the stream where characters are read from.
To read from the standard input, stdin can be used for this parameter.

goatboy
23-07-2011, 11:09
Ho sostituito alla scanf dell'username, la fgets, ma mi da errore:


#include <stdio.h>
#include <stdlib.h>
#define USER_FILE "user.txt"

typedef struct{
char user[30];
char pass[30];
char email[50];
int age;
} user;

int main(void){
FILE *fp;
user u;
if (!(fp=fopen(USER_FILE,"a"))){
printf("Errore\n");
exit(1);
}
printf ("Inseririmento di un nuovo utente: \n\n");
printf ("Username: ");
fgets(user,sizeof(user),*fp);
printf ("Password: ");
scanf ("%s",u.pass);
printf ("Email: ");
scanf ("%s",u.email);
printf ("Eta': ");
scanf ("%d",&u.age);

/* Scrivo i dati sul file */
fprintf(fp, "%s\t%s\t%s\t%d\n", u.user, u.pass, u.email, u.age);
printf("Dati scritti con successo.\n");
fclose(fp);
}


Dov'Ŕ che sbaglio?

oregon
23-07-2011, 11:17
Originariamente inviato da goatboy

Dov'Ŕ che sbaglio?

Ti era giÓ stato suggerito

"To read from the standard input, stdin can be used for this parameter"

Loading