View Full Version : [FILE C]Ho qualche problemino
Gogeta ss4
05-05-2004, 17:57
Raga non riesco a capire gli errori di questo listato:
#include "stdafx.h"
#include <stdio.h>
struct iscrizione
{
char nickname[10];
char email[50];
char password[10];
char ripeatpassword[10];
};
struct accesso
{
char nickname[10];
char password[10];
};
struct nuovo_admin
{
char nome[50];
char cognome[50];
char anni[5];
char nickname[10];
char password[10];
char ripetipassword[10];
char email[50];
};
typedef struct iscrizione registrazione;
typedef struct accesso login;
typedef struct nuovo_admin new_admin;
//Prototipi
void new_account(registrazione, FILE *);
int main(int argc, char* argv[])
{
FILE *fp;
registrazione reg;
int scelta;
do
{
printf("\n Sistem Login Tournament");
printf("\n 1)Crea Nuovo Account");
printf("\n 2)Login");
printf("\n 3)Password Smarrita");
printf("\n 0)Uscita");
printf("\n Scelta: ");
scanf ("%d",&scelta);
switch(scelta)
{
case 1: new_account(reg,fp); break;
case 2: break;
case 3: break;
case 0: break;
default: printf("\nErrore: Opzione Inesistente!!");
}
} while(scelta!=0);
return 0;
}
//Funzioni
void new_account(registrazione reg, FILE *fp)
{
printf("\n Creazione Nuovo Account");
printf("\nNickname (MAX 10): ");
gets (reg.nickname);
printf("\nPassword: ");
gets (reg.password);
printf("\nRipeti Password: ");
gets (reg.ripeatpassword);
printf("\nE-Mail: ");
gets (reg.email);
}
fp=fopen("iscrizione.txt","at");
if(fp!=NULL)
fwrite(®istrazione,sizeof(registrazione),1,fp);
else
printf("\nErrore di scrittura, prova a rieseguire l'operazione");
fclose(fp);
}
Mi da questi errori:
"error C2501: 'fp' : missing storage-class or type specifiers
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(79) : error C2440: 'initializing' : cannot convert from 'struct _iobuf *' to 'int'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(80) : error C2143: syntax error : missing ';' before 'if'
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(82) : error C2143: syntax error : missing ';' before 'else'
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(84) : error C2501: 'fclose' : missing storage-class or type specifiers
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(84) : error C2373: 'fclose' : redefinition; different type modifiers
c:\programmi\microsoft visual studio\vc98\include\stdio.h(285) : see declaration of 'fclose'
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(86) : error C2143: syntax error : missing ';' before '}'
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(86) : error C2143: syntax error : missing ';' before '}'
C:\Programmi\Microsoft Visual Studio\Progetti\Account\Account.cpp(86) : error C2143: syntax error : missing ';' before '}'
Error executing cl.exe."
Dove sbaglio?
Gogeta ss4
05-05-2004, 18:27
ho risolto facendo una variabile d'appoggio del tipo: registrazione reg;
Ho un altro problema :( , ho modificato il listato, mi da un errore su fp=fopen :(
La prima cosa che salta all'okkio è che le ultime tre righe
fp=fopen("gestione_account/iscrizione.txt","a");
fwrite(®istrazione,sizeof(registrazione),1,fp);
fclose(fp);
sono fuori dalla funzione account che si chiude con la graffa subito sopra
ma dovrebbero cmq appartenere al main penso poiche' fp è dichiarato localmente là.
Poi per le struct io avrei tentato la dichiarazione in un altro modo
Esempio per struct accesso
typedef struct{
char nickname[10];
char password[10];
} accesso;
e poi normalmente avrei istanziato
accesso login; nel main
Gogeta ss4
05-05-2004, 18:37
Originariamente inviato da orpheus
La prima cosa che salta all'okkio è che le ultime tre righe
fp=fopen("gestione_account/iscrizione.txt","a");
fwrite(®istrazione,sizeof(registrazione),1,fp);
fclose(fp);
sono fuori dalla funzione account che si chiude con la graffa subito sopra
ma dovrebbero cmq appartenere al main penso poiche' fp è dichiarato localmente là.
Poi per le struct io avrei tentato la dichiarazione in un altro modo
Esempio per struct accesso
typedef struct{
char nickname[10];
char password[10];
} accesso;
e poi normalmente avrei istanziato
accesso login; nel main
Cavolo non mi ero accorto di quella parentesi, grazie!!
Adesso mi da solo un errore:) Vediamo se riesco a risolverlo
Ah risolto allora nada...hai modificato il codice ke c'era prima nel post xo' ??....xke' senno' mi sono inventato quello he mi sono ricopiato prima...
Gogeta ss4
05-05-2004, 18:41
L'errore l'ho risolto e il programma parte, però non so se gli scrivo correttamente la struttura dentro al file, ecco il pezzo di codice:
void new_account(registrazione reg, FILE *fp)
{
printf("\n Creazione Nuovo Account");
printf("\nNickname (MAX 10): ");
fflush(stdin);
gets (reg.nickname);
printf("\nPassword: ");
fflush(stdin);
gets (reg.password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (reg.ripeatpassword);
printf("\nE-Mail: ");
fflush(stdin);
gets (reg.email);
fp=fopen("iscrizione.txt","at");
if(fp!=NULL)
fwrite(®,sizeof(reg),1,fp);
else
printf("\nErrore di scrittura, prova a rieseguire l'operazione");
fclose(fp);
}
registrazione sarebbe struct iscrizione e reg sarebbe registrazione reg;
E' giusto??
Gogeta ss4
05-05-2004, 18:55
Ho fatto una prova è funzia!!!
E dire che ancora a scuola di struttura con i file non me le hanno spiegate :D
Gogeta ss4
05-05-2004, 19:05
visto che sapete darmi delle ottime soluzioni volevo chiedervi un'altra cosa.
Allora sto facendo la funzione di login, ovvero l'utente inserisce nickname e password e poi vado a ricercare se sono corrette e se si lo faccio accedere alla sua area.
allora mi consigliate di scaricare le strutture da file su un vettore e poi eseguire una ricerca su vettore, oppure di fare tutto direttamente dentro il file?
Dipende da quante volte devi ricercare il dato...
Se lo devi cercare solo una volta (un solo login o login poco frequenti) allora non caricare un vettore, ma cerca l'utente man mano scorrendo il file...
Se la ricerca la devi fare spesso e devi, magari, fare altre operazioni sui record conviene tenere tutto in un vettore in memoria...
Gogeta ss4
05-05-2004, 19:17
ho optato per la ricerca interna al file.
Adesso sto confrontando la password nel campo password che è una stringa con la password immessa che è una stringa, non posso scrivere: if(reg.password==password) ??
Devo usare strcmp??
Gogeta ss4
05-05-2004, 19:24
while((reg.nickname!=nickname)&&(!feof(fp)))
if(controllo=(strcmp(reg.password, password)))==0)
printf("\nSistema Di Login Eseguito Correttamente");
Mi da questo errore e non riesco a capire perchè :eek: :eek:
error C2143: syntax error : missing ';' before '=='
Gogeta ss4
05-05-2004, 19:27
Avevo dimenticato una parentesi :rolleyes:
Però non funziona mi fa un ciclo infinito dicendo sempre Nickname o password diversi, ecco il codice:
void log_in(FILE *fp,login log,registrazione reg)
{
int controllo;
char nickname[10],password[10];
fp=fopen("iscrizione.txt","rt");
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("Password: ");
fflush(stdin);
gets (password);
while((reg.nickname!=nickname)&&(!feof(fp)))
if((controllo=(strcmp(reg.password, password)))==0)
printf("\nSistema Di Login Eseguito Correttamente");
else
printf("\nNickname O Password Errati!!");
fclose(fp);
controllo = 1;
while(controllo && !feof(fp))
controllo = strcmp(reg.password, password);
if(!controllo)
printf("\nSistema Di Login Eseguito Correttamente");
else
printf("\nNickname O Password Errati!!");
Gogeta ss4
05-05-2004, 20:25
Allora ho rifatto la funziona in questo modo:
void log_in(FILE *fp,login log,registrazione reg)
{
int controllo=1,n;
char nickname[10],password[10];
fp=fopen("iscrizione.txt","rt");
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("Password: ");
fflush(stdin);
gets (password);
while(!feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n==0)
{
printf("\nNickname Inesistente, prova a registrarlo e riprova");
fclose(fp);
}
else
{
while((reg.nickname!=nickname))
if((controllo=(strcmp(reg.password, password)))==0)
printf("\nSistema Di Login Eseguito Correttamente");
else
printf("\nNickname O Password Errati!!");
}
}
fclose(fp);
}
Allora mi roconosce correttamente se la pass è giusta o no, però non riesco a capire perchè mi fa un ciclo infinito con scritto : Sistema di login corretto se la pass è giusta, oppure mi fa il ciclo infinito che scrive Nickname o password errati se la pass è errata.
Dove sbaglio??
Qui: while((reg.nickname!=nickname))
Gogeta ss4
05-05-2004, 20:34
e come lo modifico? ho provato a fare così:
trovato=0;
while((reg.nickname!=nickname)&&(trovato==0))
if((controllo=(strcmp(reg.password, password)))==0)
{
printf("\nSistema Di Login Eseguito Correttamente");
trovato=1;
}
else
printf("\nNickname O Password Errati!!");
Però mi da sempre lo stesso errore
Come dovrei impostare quel while?
Non capisco a cosa ti serve quel while...
controllo = 1;
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0) /*effettuo il controllo sui dati*/
controllo = strcmp(reg.password, password) ||
strcmp(reg.nickname, nickname);
}
if(!controllo) /*se il controllo ha avuto successo controllo == 0*/
printf("\nSistema Di Login Eseguito Correttamente");
else
printf("\nNickname O Password Errati!!");
Gogeta ss4
05-05-2004, 20:45
funziona!!
Mi spieghi un po che non ho capito bene ??
Gogeta ss4
05-05-2004, 21:00
io uso microsoft visual c++, c'è qualche funzione per cancellare la schermata, ho visto che clrscr() non funge...
Te lo commento meglio...
/*setto controllo a 1 (se è != 0 non c'è stato un risultato valido)*/
controllo = 1;
/*fai il ciclo fino a quando controllo è diverso da zero e non si è
raggiunta la fine del file */
/*valutare l'espressione booleana "controllo" equivale a valutare "controllo != 0"*/
while(controllo && !feof(fp))
{
/*leggo la struttura*/
n=fread(®,sizeof(reg),1,fp);
/* se ho letto una struttura valida (n > 0) */
if(n>0) /*effettuo il controllo sui dati*/
/*controllo è diventa diverso da zero se uno qualsiasi dei due
controlli su password e nickname è fallito (diverso da zero) (|| è
l'or logico)*/
/*Quindi controllo è uguale (così dopo esce dal ciclo) se
entrambi i confronti fra password e nickname hanno avuto
successo (ritornano zero se le stringhe sono uguali)
controllo = strcmp(reg.password, password) || strcmp(reg.nickname, nickname);
}
/*se il ciclo sopra è finito perchè è finito il file allora controllo è
diverso da zero (non abbiamo trovato username e nickname
validi)*/
/*se il ciclo sopra è finito perchè il controllo su nickname è
passsword ha avuto successo allora controllo è uguale a zero*/
/*valutare l'espressione booleana "!controllo" (not) equivale a
valutare "controllo == 0"*/
if(!controllo) /*se il controllo ha avuto successo controllo == 0*/
printf("\nSistema Di Login Eseguito Correttamente");
else
printf("\nNickname O Password Errati!!");
Originariamente inviato da Gogeta ss4
io uso microsoft visual c++, c'è qualche funzione per cancellare la schermata, ho visto che clrscr() non funge...
system("cls");
system la trovi in stdlib.h
Gogeta ss4
05-05-2004, 21:10
grazie
Gogeta ss4
05-05-2004, 21:20
void new_account(registrazione reg, FILE *fp)
{
int controllo,n;
char nickname[10];
printf("\n Creazione Nuovo Account");
printf("\nNickname (MAX 10): ");
fflush(stdin);
gets (nickname);
printf("\nPassword: ");
fflush(stdin);
gets (reg.password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (reg.ripeatpassword);
printf("\nE-Mail: ");
fflush(stdin);
gets (reg.email);
controllo=1;
fp=fopen("iscrizione.txt","at");
if(fp!=NULL)
{
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo=strcmp(reg.nickname, nickname);
}
if(controllo!=0)
{
strcpy(reg.nickname, nickname);
fwrite(®,sizeof(reg),1,fp);
}
else
printf("\nNickname esistente, scegline un'altro");
}
else
printf("\nErrore di scrittura, prova a rieseguire l'operazione");
fclose(fp);
}
Nella funzione new_account devo controllare se il nick inserito è già esistente, ho fatto un po come per il login, il programma parte, però dopo che inserisco tutti i dati, si blocca e non va avanti...
Dove sbaglio?
Sarà la stanchezza ma non riesco a capire l'errore
fp=fopen("iscrizione.txt","r+t");
Se apri il file in appending lo apri a partire dal fondo...
Gogeta ss4
05-05-2004, 21:28
ho messo a+t perchè devo anche scrivere :)
Certo che faccio di quegli errori così stupidi
Cmq funziona grazie
Adesso mi sa che vado a nanna, riprendo domani!
Notte:D
Gogeta ss4
06-05-2004, 15:31
piccolo problema, quando faccio una nuova uscrizione i campi password ed e-mail sfasano, per esempio io ho messo:
Nickname: c
Pass: c
e-mail: c
un altro uguale ma con CIAO
Quando stampo ecco cosa vedo
http://www.games4u.it/errore.JPG
Perchè mi mette prova in quei campi e non c e ciao??
Gogeta ss4
06-05-2004, 15:39
Dimenticavo, ecco il listato
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
struct iscrizione
{
char nickname[10];
char email[50];
char password[10];
char ripeatpassword[10];
};
struct accesso
{
char nickname[10];
char password[10];
};
struct nuovo_admin
{
char nome[50];
char cognome[50];
char anni[5];
char nickname[10];
char password[10];
char ripetipassword[10];
char email[50];
};
typedef struct iscrizione registrazione;
typedef struct accesso login;
typedef struct nuovo_admin new_admin;
//Prototipi
void new_account(registrazione, FILE *);
void log_in(FILE *,login,registrazione);
void pass_persa(FILE *,registrazione);
void lettura(FILE *,registrazione);
int main(int argc, char* argv[])
{
FILE *fp;
registrazione reg;
login log;
int scelta;
do
{
printf("\n Sistem Login Tournament");
printf("\n 1)Crea Nuovo Account");
printf("\n 2)Login");
printf("\n 3)Password Smarrita");
printf("\n 4)Lettura");
printf("\n 0)Uscita");
printf("\n Scelta: ");
scanf ("%d",&scelta);
switch(scelta)
{
case 1: new_account(reg,fp); break;
case 2: log_in(fp,log,reg); break;
case 3: pass_persa(fp,reg); break;
case 4: lettura(fp,reg); break;
case 0: break;
default: printf("\nErrore: Opzione Inesistente!!");
}
} while(scelta!=0);
return 0;
}
//Funzioni
void new_account(registrazione reg, FILE *fp)
{
int controllo,n;
char nickname[10];
printf("\n Creazione Nuovo Account");
printf("\nNickname (MAX 10): ");
fflush(stdin);
gets (nickname);
printf("\nPassword: ");
fflush(stdin);
gets (reg.password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (reg.ripeatpassword);
printf("\nE-Mail: ");
fflush(stdin);
gets (reg.email);
controllo=1;
fp=fopen("iscrizione.txt","a+t");
if(fp!=NULL)
{
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo=strcmp(reg.nickname, nickname);
}
if(controllo!=0)
{
strcpy(reg.nickname, nickname);
fwrite(®,sizeof(reg),1,fp);
printf("\nCreazione nuovo account riuscita");
printf("\nPremere invio per continuare...");
getch();
system("cls");
}
else
{
printf("\nNickname esistente, scegline un'altro");
printf("\nPremere invio per continuare...");
getch();
system("cls");
}
}
else
printf("\nErrore di scrittura, prova a rieseguire l'operazione");
fclose(fp);
}
void log_in(FILE *fp,login log,registrazione reg)
{
int controllo=1,n,trovato=0;
char nickname[10],password[10];
printf("\n Inserisci i dati rispettando le lettere maiscuole e minuscole");
fp=fopen("iscrizione.txt","rt");
if(fp!=NULL)
{
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("Password: ");
fflush(stdin);
gets (password);
controllo = 1;
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo = strcmp(reg.password, password)||strcmp(reg.nickname, nickname);
}
if(!controllo)
{
printf("\nSistema Di Login Eseguito Correttamente");
printf("\nPremere invio per continuare...");
getch();
system("cls");
}
else
{
printf("\nNickname o Password Errati!!");
printf("\nPremere invio per continuare...");
getch();
system("cls");
}
}
else
{
printf("\nErrore di Lettura, premere un tasto per continuare...");
getch();
system("cls");
}
}
void pass_persa(FILE *fp,registrazione reg)
{
char nickname[10],email[50];
int controllo=1,n;
printf("\n Inserisci i dati rispettando le lettere maiscuole e minuscole");
fp=fopen("iscrizione.txt","rt");
if(fp!=NULL)
{
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("\nE-Mail: ");
fflush(stdin);
gets (email);
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo=strcmp(reg.nickname, nickname)||strcmp(reg.email, email);
}
if(controllo==0)
{
printf("\nLa tua password e': %s", reg.password);
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
}
else
{
printf("\nNickname o E-mail errati!!");
printf("\nPremi invio per continuare...");
getch();
system("cls");
}
}
else
{
printf("\nErrore di lettura, premere un tasto per tornare al menù principale..");
getch();
system("cls");
}
}
void lettura(FILE *fp,registrazione reg)
{
int n;
fp=fopen("iscrizione.txt","rt");
if(fp!=NULL)
{
while(!feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
{
printf("\nNickname: %s", reg.nickname);
printf("\nPassword: %s", reg.password);
printf("\nE-Mail: %s", reg.email);
}
}
}
else
printf("\nErrore di lettura");
}
Gogeta ss4
06-05-2004, 20:06
nessuno? :(
Gogeta ss4
07-05-2004, 15:21
Ho messo apposto :D :D
Gogeta ss4
07-05-2004, 18:41
cionci c'è una funzione in c che provoca l'immediata uscita dal programma e per cancellare il file senza farlo manualmente??
Per l'immediata uscita dal programma c'è la exit().
Vuole un intero come argomento, per essere elaborato da un eventuale batch che ha eseguito il programma e vuole controllarne il codice di ritorno
Per cancellare un file non ricordo. Ma potresti fare :
system ("del miofile.ext"); (per windows) oppure
system ("rm miofile"); (per unix)
Gogeta ss4
07-05-2004, 21:17
ok funzia, per la exit lo usata così: exit(EXIT_SUCCESS); :)
Ciao,anch'io ho qualche problema con un esercizio sui files...In pratica, devo leggere da
un file dei records, devo ricercare nel file una stringa in uno dei campi della struct (nel mio
caso da LINEA) ed in quel caso devo sovrascrivere i rimanenti campi del record.
Faccio un esempio: Cerco il record con la LINEA= A01, lo trovo nel file ed i campi sono:
NOMINATIVO[81]=Toto
UBICAZIONE[81]=boh
FATTURAZIONE_VIA[81]=Via vasco
FATTURAZIONE_CAP[6]=54534
FATTURAZIONE_LOCALITA[81]=Milano
socio=s
Questi li devo sovrascrivere con altri input dati da me. Il problema sorge quando uso la
fprintf, e come se il file non lo sovrascrivo..Dove sbaglio?
#include <string.h>
#include <stdio.h>
#include <process.h>
#define npfile "clienti.bgr"
typedef struct
{
char LINEA[4];
char NOMINATIVO[81];
char UBICAZIONE[81];
char FATTURAZIONE_VIA[81];
char FATTURAZIONE_CAP[6];
char FATTURAZIONE_LOCALITA[81];
char socio;
}myrecordlettura;
int main()
{
myrecordlettura miorec[10]; //array di 10 struct
int numread=10;
char cercata[4];
FILE *f;
f=fopen(npfile,"r+");
printf("Inserirsci la LINEA da cercare: ");
scanf("%s",cercata);
while (numread==10) //solo quando siamo alla fine del file i record letti possono essere diversi da 10...
{
numread=fread(miorec,sizeof(myrecordlettura),10,f); //si legge 10 record....
for(int i=0;i<numread;i++) //....e controlla che la LINEA cercata si trova tra i 10 record letti...
{
if (strcmp(cercata,miorec[i].LINEA)==0)
{
printf("LINEA TROVATA\n");
printf("Inserisci nuovo nominativo: ");
scanf("%s",miorec[i].NOMINATIVO);
fprintf(f,"%s",miorec[i].NOMINATIVO);
printf("Inserisci nuova ubicazione: ");
scanf("%s",miorec[i].UBICAZIONE);
fprintf(f,"%s",miorec[i].UBICAZIONE);
printf("Inserisci nuova fatturazione_via: ");
scanf("%s",miorec[i].FATTURAZIONE_VIA);
fprintf(f,"%s",miorec[i].FATTURAZIONE_VIA);
printf("Inserisci nuova fatt_cap: ");
scanf("%s",miorec[i].FATTURAZIONE_CAP);
fprintf(f,"%s",miorec[i].FATTURAZIONE_CAP);
printf("Inserisci nuova fat_loc: ");
scanf("%s",miorec[i].FATTURAZIONE_LOCALITA);
fprintf(f,"%s",miorec[i].FATTURAZIONE_LOCALITA);
printf("Inserisci nuovo socio: ");
scanf("%c",miorec[i].socio);
fprintf(f,"%c",miorec[i].socio);
fclose(f);
exit(1);
}
}
}
fclose(f);
return 0;
}
Il mio consiglio è quello di usare open() e write().
Quest'utima ti consente di srivere l'intera scrittura con una call solamente, senza invocare le varie printf.
Esempio:
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/io.h> /* non mi ricordo se è si chiama così */
#define npfile "clienti.bgr"
#define NUMREC 10
typedef struct
{
char LINEA[4];
char NOMINATIVO[81];
char UBICAZIONE[81];
char FATTURAZIONE_VIA[81];
char FATTURAZIONE_CAP[6];
char FATTURAZIONE_LOCALITA[81];
char socio;
} myrecordlettura;
int main()
{
myrecordlettura miorec[NUMREC]; //array di 10 struct
int numread=NUMREC;
char cercata[4];
int f;
int i = 0;
f=open(npfile, O_RW); /* LETTURA E SCRITTURA */
/* leggo tutto l'array dal file */
if (read (f, (char *) &miorec < 0) {
exit (1); /* errore in lettura */
}
printf("Inserirsci la LINEA da cercare: ");
scanf("%s",cercata);
while (i < NUMREC && ) {
if (strcmp (miorec[i].LINEA, cercata) == 0) {
/* Stringa trovata */
/* Riempi la stuttura miorec[i] */
printf("Inserisci nuovo nominativo: ");
scanf("%s",miorec[i].NOMINATIVO);
printf("Inserisci nuova ubicazione: ");
scanf("%s",miorec[i].UBICAZIONE);
printf("Inserisci nuova fatturazione_via: ");
scanf("%s",miorec[i].FATTURAZIONE_VIA);
printf("Inserisci nuova fatt_cap: ");
scanf("%s",miorec[i].FATTURAZIONE_CAP);
printf("Inserisci nuova fat_loc: ");
scanf("%s",miorec[i].FATTURAZIONE_LOCALITA);
printf("Inserisci nuovo socio: ");
scanf("%c",miorec[i].socio);
/* sovrascrivo il mio array modificato */
write (f, miorec, sizeof (miorec));
break;
}
i++;
}
close (f);
Il codice l'ho scritto a braccio, perciò non è compilabile ma in linea di massima l'idea è questa.
Non puoi usare la fprinft per gestire i record: non è conveniente.
Se hai dubbi, chiedi
Innanzitutto grazie per la risposta ;)
Il mio primo dubbio, perchè usare open e non fopen, in generale perchè usi le funzioni non precedute dalla f?
Questo
fread(miorec,sizeof(myrecordlettura),10,f)
è uguale a
read (f, (char *) &miorec < 0) ?
Non capisco questo ciclo while scritto così:
while (i < NUMREC && )
perchè l'and non è seguito da alcuna espressione?
Grazie
Gogeta ss4
08-05-2004, 13:34
prova a mettere così:
fread(&miorec,sizeof(myrecordlettura),10,f)
Non dovrebbe esser necessario usare l'indirizzo per un array, giusto?
Un'altra cosa: quando nel codice dici <</* sovrascrivo il mio array modificato */>>, questo è necessario?
Se abbiamo aperto il file in "r+", alla chiusura,il file, non dovrebbe essere scritto e salvato?
Gogeta ss4
08-05-2004, 14:06
e un array di record giusto?
Se e così allora mi sono sbagliato
Bhe in teoria dovrebbe essere così..
Cmq non ti conviene utilizzare fprintf, io ti consiglierei fwrite.
Leggi con fread quello che cerchi una volta cercato lo modifichi e poi riscrivi tutto.
Gogeta ss4
08-05-2004, 16:09
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
struct iscrizione
{
char nickname[10];
char email[50];
char password[10];
char ripeatpassword[10];
};
struct accesso
{
char nickname[10];
char password[10];
};
struct nuovo_admin
{
char nome[50];
char cognome[50];
char anni[5];
char nickname[10];
char password[10];
char ripetipassword[10];
char email[50];
};
typedef struct iscrizione registrazione;
typedef struct accesso login;
typedef struct nuovo_admin new_admin;
//Prototipi
void new_account(registrazione, FILE *);
void log_in(FILE *,login,registrazione);
void pass_persa(FILE *,registrazione);
void lettura(FILE *,registrazione);
void log_in_admin(FILE *,nuovo_admin);
void menu_user(registrazione);
void menu_admin();
void profilo(registrazione);
void mod_profilo(registrazione);
void member_list(registrazione);
int main(int argc, char* argv[])
{
FILE *fp,*fp1,*fp2;
registrazione reg;
login log;
new_admin admin;
int scelta,control=0;
char c,nome[20],cognome[20],anni[5],nickname[
10],password[10],ripetipassword[10],emai
l[50];
fp1=fopen("admin.dat","rt");
if(fp1!=NULL)
{
do
{
printf("\n Sistem Login Tournament");
printf("\n 1)Crea Nuovo Account");
printf("\n 2)Login");
printf("\n 3)Password Smarrita");
printf("\n 4)Lettura");
printf("\n 5)Login Admin");
printf("\n 0)Uscita");
printf("\n Scelta: ");
scanf ("%d",&scelta);
switch(scelta)
{
case 1: new_account(reg,fp); break;
case 2: log_in(fp,log,reg); break;
case 3: pass_persa(fp,reg); break;
case 4: lettura(fp,reg); break;
case 5: log_in_admin(fp,admin); break;
case 0: break;
default: printf("\nErrore: Opzione Inesistente!!");
}
} while(scelta!=0);
}
else
{
fp2=fopen("admin.dat","wt");
printf("\n ATTENZIONE!!");
printf("\n Non esiste ancora un amministratore di sistema, lo si vuole creare? (s/n): ");
scanf ("%c",&c);
if((c=='s')||(c=='S'))
{
system("cls");
printf("\n Creazione Nuovo Amministratore");
printf("\nNome: ");
fflush(stdin);
gets (nome);
printf("\nCognome: ");
fflush(stdin);
gets (cognome);
printf("\nEta': ");
fflush(stdin);
gets (anni);
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("\nPassword: ");
fflush(stdin);
gets (password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (ripetipassword);
printf("\nE-Mail: ");
fflush(stdin);
gets (email);
strcpy(admin.nome, nome);
strcpy(admin.cognome, cognome);
strcpy(admin.anni, anni);
strcpy(admin.nickname, nickname);
strcpy(admin.password, password);
strcpy(admin.ripetipassword, ripetipassword);
strcpy(admin.email, email);
control=fwrite(&admin,sizeof(admin),1,fp2);
if(control==0)
{
printf("\nErrore nella creazione dell'amministratore!");
printf("\nPremere un tasto per uscire dal programma...");
system("del admin.dat");
getch();
exit(EXIT_SUCCESS);
}
else
{
printf("\nCreazione Amministratore avvenuta con successo!");
printf("\nPremere un tasto per chiudere il programma...");
fclose(fp2);
getch();
exit(EXIT_SUCCESS);
}
}
else
{
printf("\nQuesto software necessita di almeno un Amministratore!");
printf("\nPremere un tasto per chiudere il programma...");
fclose(fp2);
system("del admin.dat");
getch();
exit(EXIT_SUCCESS);
}
}
return 0;
}
//Funzioni
void new_account(registrazione reg, FILE *fp)
{
int controllo,n;
char nickname[10],password[10],ripeatpassword
[10],email[10];
printf("\n Creazione Nuovo Account");
printf("\nNickname (MAX 10): ");
fflush(stdin);
gets (nickname);
printf("\nPassword: ");
fflush(stdin);
gets (password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (ripeatpassword);
printf("\nE-Mail: ");
fflush(stdin);
gets (email);
controllo=1;
fp=fopen("iscrizione.dat","a+t");
if(fp!=NULL)
{
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo=strcmp(reg.nickname, nickname);
}
if(controllo!=0)
{
strcpy(reg.nickname, nickname);
strcpy(reg.password, password);
strcpy(reg.email, email);
fwrite(®,sizeof(reg),1,fp);
printf("\nCreazione nuovo account riuscita");
printf("\nPremere invio per continuare...");
fclose(fp);
getch();
system("cls");
}
else
{
printf("\nNickname esistente, scegline un'altro");
printf("\nPremere invio per continuare...");
fclose(fp);
getch();
system("cls");
}
}
else
printf("\nErrore di scrittura, prova a rieseguire l'operazione");
fclose(fp);
}
void log_in(FILE *fp,login log,registrazione reg)
{
int controllo=1,n;
char nickname[10],password[10];
printf("\n Inserisci i dati rispettando le lettere maiscuole e minuscole");
fp=fopen("iscrizione.dat","rt");
if(fp!=NULL)
{
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("Password: ");
fflush(stdin);
gets (password);
controllo = 1;
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo = strcmp(reg.password, password)||strcmp(reg.nickname, nickname);
}
if(!controllo)
{
printf("\nSistema Di Login Eseguito Correttamente");
printf("\nPremere invio per continuare...");
fclose(fp);
getch();
system("cls");
menu_user(reg);
}
else
{
printf("\nNickname o Password Errati!!");
printf("\nPremere invio per continuare...");
fclose(fp);
getch();
system("cls");
}
}
else
{
printf("\nErrore di Lettura, premere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
}
}
void pass_persa(FILE *fp,registrazione reg)
{
char nickname[10],email[50];
int controllo=1,n;
printf("\n Inserisci i dati rispettando le lettere maiscuole e minuscole");
fp=fopen("iscrizione.dat","rt");
if(fp!=NULL)
{
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("\nE-Mail: ");
fflush(stdin);
gets (email);
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo=strcmp(reg.nickname, nickname)||strcmp(reg.email, email);
}
if(controllo==0)
{
printf("\nLa tua password e': %s", reg.password);
printf("\nPremere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
}
else
{
printf("\nNickname o E-mail errati!!");
printf("\nPremi invio per continuare...");
fclose(fp);
getch();
system("cls");
}
}
else
{
printf("\nErrore di lettura, premere un tasto per tornare al menù principale..");
fclose(fp);
getch();
system("cls");
}
}
void log_in_admin(FILE *fp,new_admin admin)
{
int controllo=1,n;
char nickname[10],password[10];
printf("\n Inserisci i dati rispettando le lettere maiscuole e minuscole");
fp=fopen("admin.dat","a+t");
if(fp!=NULL)
{
printf("\n Area Di Login Per Amministratori");
printf("\nNickname: ");
fflush(stdin);
gets (nickname);
printf("\nPassword: ");
fflush(stdin);
gets (password);
while(controllo && !feof(fp))
{
n=fread(&admin,sizeof(admin),1,fp);
if(n>0)
controllo=strcmp(admin.password, password)||strcmp(admin.nickname, nickname);
}
if(controllo==0)
{
printf("\nSistema Di Login Eseguito Correttamente");
printf("\nPremere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
}
else
{
printf("\nNickname o Password Errati");
printf("\nPremere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
}
}
}
void menu_user(registrazione reg)
{
int scelta;
do
{
printf("\n Spazio Utenti");
printf("\n 1)Tuo Profilo");
printf("\n 2)Modifica Profilo");
printf("\n 3)Lista Membri");
printf("\n 4)Logout");
printf("\n 0)Uscita");
printf("\n Scelta: ");
scanf ("%d",&scelta);
switch(scelta)
{
case 1: profilo(reg); break;
case 2: mod_profilo(reg); break;
case 3: member_list(reg); break;
case 4: break;
case 0: exit(EXIT_SUCCESS);break;
default: printf("\nErrore: Opzione Inesistente");
}
}
while(scelta!=0);
}
void lettura(FILE *fp,registrazione reg)
{
int n;
fp=fopen("iscrizione.dat","rt");
if(fp!=NULL)
{
while(!feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
{
printf("\nNickname: %s", reg.nickname);
printf("\nPassword: %s", reg.password);
printf("\nE-Mail: %s", reg.email);
}
}
}
else
printf("\nErrore di lettura");
}
Mi da questi 3 errori:
unresolved external symbol "void __cdecl member_list(struct iscrizione)" (?member_list@@YAXUiscrizione@@@Z)
unresolved external symbol "void __cdecl mod_profilo(struct iscrizione)" (?mod_profilo@@YAXUiscrizione@@@Z)
unresolved external symbol "void __cdecl profilo(struct iscrizione)" (?profilo@@YAXUiscrizione@@@Z)
Dove sbaglio?
Innanzitutto grazie per la risposta ;)
Innanzitutto scusa per le tante imprecisioni, ma il fatto è che ho scritto di fretta e a memoria. :D
Il mio primo dubbio, perchè usare open e non fopen, in generale perchè usi le funzioni non precedute dalla f?
Questo
fread(miorec,sizeof(myrecordlettura),10,f)
è uguale a
read (f, (char *) &miorec < 0) ?
Ma tu non hai usato la fread, hai usato la fprintf(), che non va bene al caso tuo.
La fread() invece va bene.
In genere preferisco quelle senza la "f" in quanto l'I/O con quest'ultime è bufferizzato; preferisco l'I/O sincronizzato.
Non capisco questo ciclo while scritto così:
while (i < NUMREC && )
perchè l'and non è seguito da alcuna espressione?
Hai di nuovo ragione. Puoi togliere quel refuso di "&&" (inizialmente avevo posto un AND e poi l'ho tolto).
Un'altra cosa: quando nel codice dici <</* sovrascrivo il mio array modificato */>>, questo è necessario?
Se abbiamo aperto il file in "r+", alla chiusura,il file, non dovrebbe essere scritto e salvato?
No!. se non esegui la fwrite (o la write) i dati nel file rimangono quelli di prima perché tu la modifica la stai facendo con i dati dell'array in memoria :).
E' per questo che dopo aver eseguito la modifica al tuo array, se vuoi che tali modifiche siano permanenti, devi salvarle nel file con fwrite (o write).
Se abbiamo aperto il file in "r+", alla chiusura,il file, non dovrebbe essere scritto e salvato?
In questo modo tu hai specificato al S.O. che il file è aperto in lettura e scrittura. Ma se non fai la fwrite (o write) i dati sul file non saranno mai salvati!
Non dovrebbe esser necessario usare l'indirizzo per un array, giusto?
Si, il nome dell'array è di per se un pointer all'array stesso ;)
Gogeta ss4
08-05-2004, 18:16
Nessuno?? :(
Originariamente inviato da fpucci
Innanzitutto scusa per le tante imprecisioni, ma il fatto è che ho scritto di fretta e a memoria. :D
Ma tu non hai usato la fread, hai usato la fprintf(), che non va bene al caso tuo.
La fread() invece va bene.
In genere preferisco quelle senza la "f" in quanto l'I/O con quest'ultime è bufferizzato; preferisco l'I/O sincronizzato.
Hai di nuovo ragione. Puoi togliere quel refuso di "&&" (inizialmente avevo posto un AND e poi l'ho tolto).
No!. se non esegui la fwrite (o la write) i dati nel file rimangono quelli di prima perché tu la modifica la stai facendo con i dati dell'array in memoria :).
E' per questo che dopo aver eseguito la modifica al tuo array, se vuoi che tali modifiche siano permanenti, devi salvarle nel file con fwrite (o write).
In questo modo tu hai specificato al S.O. che il file è aperto in lettura e scrittura. Ma se non fai la fwrite (o write) i dati sul file non saranno mai salvati!
Si, il nome dell'array è di per se un pointer all'array stesso ;)
Grazie ancora per le precisazioni, mi ci metto sotto con l'esercizio e vediamo se posso raggiungere una soluzione!!
i
Gogeta ss4
09-05-2004, 19:29
void profilo(registrazione reg, char nickname[])
{
FILE *fp;
int control=1,n;
fp=fopen("iscrizione.dat","rt");
if(fp!=NULL)
{
while (control==1 && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
control=strcmp(reg.nickname, nickname);
}
if(control==0)
{
printf("\n Ecco i tuoi dati\n");
printf("\nNickname: %s", reg.nickname);
printf("\nPassword: %s", reg.password);
printf("\nE-Mail: %s", reg.email);
printf("\nPremere un tasto per continuare...");
getch();
fclose(fp);
system("cls");
}
else
{
printf("\nDati Inesistenti, premere un tasto per continuare...");
getch();
fclose(fp);
system("cls");
}
}
else
{
printf("\nErrore di lettura, prova a rieseguire l'operazione");
printf("\nPremere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
}
}
void mod_profilo(registrazione reg, char nickname[])
{
FILE *fp;
int control=1,n,c,pos=0;
char password[10],ripetipassword[10],email[50];
printf("\n ATTENZIONE!!");
printf("\n Il tuo Nickname rimmarrà invariato, non puoi modificarlo!\n");
printf("\nNuova Password: ");
fflush(stdin);
gets (password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (ripetipassword);
printf("\nNuova E-Mail: ");
fflush(stdin);
gets (email);
fp=fopen("iscrizione.dat","r+t");
if(fp!=NULL)
{
while(control==1 && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
control=strcmp(reg.nickname, nickname);
}
if(control==0)
{
pos=(ftell(fp))-(sizeof(reg));
fclose(fp);
strcpy(reg.password, password);
strcpy(reg.ripeatpassword, ripetipassword);
strcpy(reg.email, email);
fp=fopen("iscrizione.dat","r+");
fseek(fp,pos,0);
c=fwrite(®,sizeof(reg),1,fp);
if(c>0)
{
printf("\nOperazione eseguita con successo!");
fclose(fp);
profilo(reg,nickname);
system("cls");
}
else
{
printf("\nSi e' vericato un errore nel salvare i dati.");
printf("\nContatta l'amministratore di sistema");
printf("\nPremere un tasto per continuare...");
getch();
fclose(fp);
system("cls");
}
}
else
{
printf("\nErrore Interno: Il tuo nickname non esiste!!");
printf("\nContatta l'amministratore di sistema");
printf("\nPremere un tasto per continuare...");
getch();
fclose(fp);
system("cls");
}
}
else
{
printf("\nErrore Interno: Non è stato trovato il file di gestione");
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
}
}
Ho un problema con queste 2 funzioni, praticamente funzionano correttamente se nel file c'è solo un utente registrato, ma se c'è ne più di uno non funzionano correttamente, la prima funzione non mi vede il profilo se mi loggo con il secondo user, e successivamente se tento di modificarlo mi da praticamente lo stesso errore, non trova i dati.
Come mai?
fp=fopen("iscrizione.dat","r+t");
fp=fopen("iscrizione.dat","r+");
Decidi se aprirlo in binario o in testo ;)
Gogeta ss4
10-05-2004, 13:26
avevo dimenticato un fclose(fp) :oink:
Gogeta ss4
10-05-2004, 14:54
gokan ho appena finito una funzione di modifica dei campi (per quanto riguarda il mio programma), dacci un occhiata magari riesci ad aggiustare il tuo..
void mod_profilo(registrazione reg, char nickname[])
{
FILE *fp;
int control=1,n,c,pos=0;
char password[10],ripetipassword[10],email[50];
printf("\n ATTENZIONE!!");
printf("\n Il tuo Nickname rimmarrà invariato, non puoi modificarlo!\n");
printf("\nNuova Password: ");
fflush(stdin);
gets (password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (ripetipassword);
printf("\nNuova E-Mail: ");
fflush(stdin);
gets (email);
fp=fopen("iscrizione.dat","r+t");
if(fp!=NULL)
{
while(control && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
control=strcmp(reg.nickname, nickname);
}
if(control==0)
{
pos=(ftell(fp))-(sizeof(reg));
fclose(fp);
strcpy(reg.password, password);
strcpy(reg.ripeatpassword, ripetipassword);
strcpy(reg.email, email);
fp=fopen("iscrizione.dat","r+");
fseek(fp,pos,0);
c=fwrite(®,sizeof(reg),1,fp);
if(c>0)
{
printf("\nOperazione eseguita con successo!");
fclose(fp);
profilo(reg,nickname);
system("cls");
}
else
{
printf("\nSi e' vericato un errore nel salvare i dati.");
printf("\nContatta l'amministratore di sistema");
printf("\nPremere un tasto per continuare...");
getch();
fclose(fp);
system("cls");
}
}
else
{
printf("\nErrore Interno: Il tuo nickname non esiste!!");
printf("\nContatta l'amministratore di sistema");
printf("\nPremere un tasto per continuare...");
getch();
fclose(fp);
system("cls");
}
}
else
{
printf("\nErrore Interno: Non è stato trovato il file di gestione");
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
}
}
Grazie per l'interessamente, effettivamente mi potrebbe servire..:D
Gogeta ss4
10-05-2004, 22:11
Finalmente stasera ho finito la parte del programma che riguarda l'utente(10 pagine di codice :D )
Adesso devo fare quella dell'admin!
Gogeta ss4
11-05-2004, 16:55
Raga come faccio a eliminare una struttura da file?
Crei un altro file con tutte le altre strutture meno qella che vuoi eliminare...
Gogeta ss4
11-05-2004, 17:10
ok grazie.
Gogeta ss4
11-05-2004, 17:13
Dimenticavo, io uso visual c++ e quando faccio il debug mi fa vedere la freccetta di fianco a ogni istruzione, quando però richiama una funzione, la freccia si ferma alla chiamata di funzione e non va dove c'è la definizione della funzione.
Non c'è un modo per farla andare li, perchè se no se c'è qualche errore all'interno delle funzioni non riesco a vederlo
Premi F11 per entrare dentro ad un funzione... F10 per non entrarci...
Gogeta ss4
11-05-2004, 17:48
Grazie!!:D :D
Originariamente inviato da Gogeta ss4
Dimenticavo, io uso visual c++ e quando faccio il debug mi fa vedere la freccetta di fianco a ogni istruzione, quando però richiama una funzione, la freccia si ferma alla chiamata di funzione e non va dove c'è la definizione della funzione.
Non c'è un modo per farla andare li, perchè se no se c'è qualche errore all'interno delle funzioni non riesco a vederlo
Ciao Gogeta, vorrei imparare ad usare discretamente il debugger di Visual C ed in generale con qualsiasi Ide, hai seguito qualche guida particolare per imparare ad usarlo bene?
Gogeta ss4
11-05-2004, 18:45
no, ti spiego brevemente.
Per iniziarlo premi F11, si avvia così il programma, poi fin quando hai istruzioni premi F10, quando dovrai inserire qualche input si blocca, a quel punto apri la finestra e inserisci l'input, dopo che lo hai inserito premi sul visual c e continui a premere F10, se trovi qualche chiamata di funzione premi F11 per entrarvi.
Tutto qui
Grazie al Debug ho risolto molti errori!.
Impara ad usarlo bene così ti rendi più facile la programmazione! :)
Lo so che il debug è uno strumento che ogni buon programmatore dovrebbe usare ;)
Grazie per le dritte :p
C'è anche molto altro... I breakpoint (si inseriscono con F9) e sono punti in cui il programma si fermerà automaticamente... Per lanciare l'esecuzione fino al primo breakpoint basta premere F5... Riprende F5 ci si ferma di nuovo al primo breakpoint...
Poi c'è il watch... Nell'apposita finestra si potranno inserire di espressioni (questo che io sappia lo fa solo VC++) e nomi di variabili per valutarne il contenuto istruzione per istruzione...
Gogeta ss4
11-05-2004, 20:37
Cionci guarda un po questa funzione:
void mod_member_admin(registrazione reg)
{
FILE *fp;
char nickname[10],password[10],ripetipassword[10],email[50],d;
int controllo=1,n,c,pos,control,v,controllo1=1;
printf("\n Area di modifica profilo membri");
printf("\nInserisci il nickname da ricercare: ");
fflush(stdin);
gets (nickname);
fp=fopen("iscrizione.dat","r+");
if(fp!=NULL)
{
while(controllo && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo=strcmp(reg.nickname, nickname);
}
if(controllo==0)
{
pos=ftell(fp)-sizeof(reg);
printf("\n Ecco i dati dell'utente %s", nickname);
printf("\nNickname: %s", reg.nickname);
printf("\nE-Mail: %s", reg.email);
printf("\nSei sicuro di voler continuare la modifica del profilo? (s/n): ");
scanf ("%c",&d);
if((d=='s')||(d=='S'))
{
strcpy(reg.nickname," ");
fseek(fp,pos,0);
fwrite(®,sizeof(reg),1,fp);
printf("\nNuovo Nickname: ");
fflush(stdin);
gets (nickname);
printf("\nNuova Password: ");
fflush(stdin);
gets (password);
printf("\nRipeti Password: ");
fflush(stdin);
gets (ripetipassword);
printf("\nNuova E-mail: ");
fflush(stdin);
gets (email);
control=strcmp(password, ripetipassword);
if(control==0)
{
fseek(fp,0,0);
while(controllo1!=0 && !feof(fp))
{
n=fread(®,sizeof(reg),1,fp);
if(n>0)
controllo1=strcmp(reg.nickname, nickname);
}
if(controllo1!=0)
{
fseek(fp,pos,0);
v=fwrite(®,sizeof(reg),1,fp);
if(v>0)
{
printf("\nOperazione eseguita con successo...");
printf("\nPremere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
}
else
{
printf("\nE' avvenuto un errore durante la memorizzazione dei dati.");
printf("\nPremere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
}
}
else
{
printf("\nNickname già registrato, scegline uno diverso");
printf("\nPremere un tasto per continuare...");
fclose(fp);
getch();
system("cls");
mod_member_admin(reg);
}
}
else
{
printf("\nHai inserito due password diverse, prova a rieseguire l'operazione");
printf("\nPremere un tasto per riniziare la procedura di modifica...");
fclose(fp);
getch();
system("cls");
}
}
else
{
printf("\nProcedura di modifica BLOCCATA");
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
fclose(fp);
}
}
else
{
printf("\nUtente non trovato");
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
fclose(fp);
}
}
else
{
printf("\nErrore Interno: Manca il file di gestione");
printf("\nPremere un tasto per continuare...");
getch();
system("cls");
}
}
Quando la eseguo, dopo che inserisco i nuovi dati, mi dice operazione eseguita con successo, però non sovrascrive niente, e cmq per dire operazione eseguita con successo passa da un fseek e da una fwrite :eek:
Non sovrascrive niente e neanke mette la struttura su file!
Dove sbaglio??
Gogeta ss4
11-05-2004, 20:47
Problema risolto, avevo dimenticato le strcpy(); :rolleyes: :rolleyes:
Ho finito il programma :sofico: :sofico:
Oggi mi sono preso anche un bel 9 in informatica :yeah: :yeah: :yeah:
Gogeta ss4
12-05-2004, 17:39
Ho risolto i problemi e aggiustato un po di cose.
Posso dire che ho chiuso con il C:D
Adesso a scuola inizierò Java e da solo farò C++
Sono difficili come linguaggi?
Non vorrei scoraggiarti...ma non si chiude mai con il C ;)
Gogeta ss4
12-05-2004, 18:50
Originariamente inviato da cionci
Non vorrei scoraggiarti...ma non si chiude mai con il C ;)
Chiuso nel senso che per il momento ho studiato tutto(tranne socket ) e quindi mi posso dedicare a altri linguaggi!
Una mia curiosità, nel mondo del lavoro è richiesto il linguaggio C??
Se lavori su Linux e i vari Unix è d'obbligo...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.