|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C] Lunghetto...prime armi
Salve a tutti. Mi chiamo Raoul e questo è il mio primo messaggio.
Vengo subito al sodo Ho scritto questo piccolo e stupido programmino perchè sto imparando a programmare in C, ma ci sono delle cose che non riesco a fare Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ELENCO 100 /* mi serve per vedere l'elenco con la scelta 2*/
/*prototipo della main*/
int main(int argc, char *argv[]); /*non ho ben chiaro perchè dev'essere così*/
/* struttura di esempio */
struct dati
{
int codice;
char cognome[40];
char nome[40];
char cfs[17]; /*per il codice fiscale*/
char ddn[11]; /*per la data di nascita*/
} anagraf;
int main(int argc, char *argv[])
{
char opfilename[] = "/home/raoul/esempio.txt"; /*per aprire il file*/
FILE *opfp;
char rfilename[] = "/home/raoul/esempio.txt"; /*per leggerlo*/
FILE *rfp;
struct tm *newtime; /*per scrivermi il tempo di memoriz. del record/*
time_t aclock;
int selection; /*variabile per il menù*/
for( ; ; ) /*mi apro un ciclo infinito*/
{
printf("\n1 - aggiunge un record");
printf("\n2 - visualizza elenco");
printf("\n3 - esci dal programma");
scanf("%d", &selection);
if (selection < 1 || selection > 3) /*limito la scelta al menu*/
{
printf("\nInserire solo da 1 a 3!!");
}
else if(selection == 3)
{
printf("\nArrivederci!!\n");
break;
}
else if(selection == 1)
{
printf("\nInserire codice per record: ");
scanf("%d", &anagraf.codice);
printf("\nInserire Cognome: ");
scanf("%s", anagraf.cognome);
printf("\nInserire Nome: ");
scanf("%s", anagraf.nome);
printf("\nInserire Codice Fiscale: ");
scanf("%s", anagraf.cfs);
printf("\nInserire data di nascita(gg-mm-aaa): ");
scanf("%s", anagraf.ddn);
/*mi apro il file per scriverci i dati*/
opfp = fopen(opfilename, "a+");
/*metto anche il "tempo" di registrazione del record*/
time (&aclock);
newtime = localtime(&aclock);
/*scrivo sul file che ho aperto*/
fprintf(opfp, "%d\t %s\t %s\t\t %s\t %s\t\n", anagraf.codice, anagraf.cognome, anagraf.nome, anagraf.cfs, anagraf.ddn, asctime(newtime));
/*dopo aver scritto chiudo il file*/
fclose (opfp);
}/*termine dell'if per la scelta 1*/
else if( selection == 2 )
{
char ind[ELENCO];
rfp = fopen(rfilename, "r"); /*apro il file per leggere i record*/
while( !feof(rfp) )/*fin quando no arrivo alla fine del file*/
{
fgets(ind, ELENCO, rfp);
printf("%s", ind);
}
fclose(rfp);
}
}/*chiusura del ciclo for*/
}/*fine main*/
Io ho cercato di farla come vedete, quindi, non sono nemmeno sicuro di averla "messa bene".... comunque, quello che non riesco a fare è: 1) Come posso fare per evitare che quando si inseriscono i dati, se vengono messi errati (ad esempio anzichè mettere il codice numerico scrivono una lettera) il programma non si blocchi? 2) Come posso fare per ricercare e visualizzare un record singolo alla volta? 3) Mi servirebbe comunque una buona critica al codice, considerando però che ho cominciato da qualche settimana, quindi, non mi spellate vivo e non ridete per piacere Grazie a tutti e complimenti a questo forum!! P.S.: io uso linux, magari se qualcuno potrebbe anche darmi qualche suggerimento su come si utilizza bene gcc e gdb, che anche linux l'ho messo da poco e mi sento un pò disorientato THX!! RaouL Ultima modifica di RaouL_BennetH : 13-09-2004 alle 16:51. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Son di fretta quindi saro' telegrafico:
Il prototipo delle funzioni serve se le aggiungi dopo il main; il prototipo del main non serve. Organizza il flusso di esecuzione in uno switch, piu elegante e comprensibile. Cerca di porganizzare il codice in microfunzioni, ne guadagni di leggibilita'. Al posto di fget ce' sempre scanf che specifica il tipo di dato inserito. Cya!! |
|
|
|
|
|
#3 | ||||
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Quote:
Quote:
Quote:
Cya!! |
||||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Scusa non avevo visto
Per i file si preferisce fwrite e fread |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Forse questo pezzettino di codice ti puo' aiutare:
Codice:
#include <stdio.h>
int main(int argc, char *argv[]) {
int scelta;
do {
printf("Menu - Digita scelta:\n");
scanf("%d", &scelta);
switch(scelta) {
case 1:
printf("Azione 1\n");
break;
case 2:
printf("Azione 2\n");
break;
case 0:
printf("Exiting...\n");
break;
default:
printf("Nessuna azione eseguita...\n");
}
} while (scelta != 0);
return 0;
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Grazie per il suggerimento Dun, ma vorrei capire una cosa:
Hai fatto un esempio con il ciclo do - while e con lo switch, mi chiedevo, oltre che ad essere più leggibile, è anche più efficiente? e se è più efficiente, lo è in questo caso o sempre? Scusa se faccio tutte queste domande magari stupide per te e per molti di voi, ma vorrei capire bene E per la ricerca di un singolo record, mi sai suggerire qualcosa? Io sto provando a leggere il capitolo che riguarda le stringhe e i confronti fra stringhe, ma non fa accenno a come posso fare il confronto su di un file Mi spiego meglio: Allora, se per esempio io volessi ricercare un operatore che ho inserito? Oppure, come potrei fare per ottenere che, se un nuovo operatore che inserisco già esiste il programma me lo segnali? grazie infinite. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Per il codice del programmino, mi sono anche accorto che è inutile utilizzare due cose diverse per aprire e leggere il file
Praticamente ne utilizzo solo una e per l'inserimento apro il file con l'opzione append e per visualizzare apro il file in modo read. Beh, è già qualche riga in meno |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
un piccolo up
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Un piccolo aiutino per fare un controllo se uno dei campi già esiste?
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
up!
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
up
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
ciao
come suggeritomi da AnonimoVeneziano, sto provando ad utilizzare la fwrite() al posto di fprintf(), ma, non riesco nemmeno a compilare il sorgente perchè mi da alcuni errori. In particolare, mi succede questo: Codice:
struct dati {
int codice;
char cognome[40];
char nome[40];
char cfs[17];
char ddn[11];
} anagraf;
/*apro il file e dichiaro quello che mi serve per farlo */
FILE *fp;
char filename[] = "/home/raoul/prova.txt"
/*qui c'è il codice che mi fa inserire i dati */
......
/*qui cerco di scriverli sul file*/
fp = fopen(filename, "a+");
fwrite(anagraf, sizeof(anagraf), 1, fp);
/*......etcetera....*/
Codice:
gcc -Wall fileprova.c -o prova error: incompatible type for argument 1 of 'write' |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Grazie per il suggerimento, infatti così funziona!! Però.... mi sono accorto che questa funzione, rispetto invece alla fprintf(), non mi scrive nel file ciò che mi serve con la giusta tabulazione Ad esempio, mi viene tutto collegato su una riga, e non mi memorizza la data di inserimento. Ora, volendo insistere su fprintf, c'è modo di fare ricerche di stringhe all'interno del file? perchè son giorni che sto leggendo una marea di roba, ma non sono ancora riuscito a trovare nulla che mi permetta di fare queste due cose: 1) ricercare un nome o un cognome o altro dato 2) al momento dell'inserimento, se inserisco un nominativo che già esiste, che il programma mi avvisi. Grazie mille Raoul. |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
fwrite non formatta l'output , ma purtroppo "fprintf" non è adatta a cercare ... Potresti implementare le 2 cose separatamente , fare una funzione per la memorizzazione dei dati (quella che già hai) e una che crea un file di testo formattato per la lettura separata . Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
ieri ero in chan, poi "alice" mi ha abbandonato comunque, se prima avevo le idee confuse, ora ho il buio davanti a me (e non certo per colpa vostra !! ) Sarà forse che non è cosa mia? ![]() Comunque, ora ci provo e ci riprovo Grazie mille!! Raoul. |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
up
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Allora, adesso con fwrite() riesco a scrivere il file ed ho provato diverse volte di capire il funzionamento di fseek() ma, probabilmente, anzi, sicuramente, non so bene nemmeno cosa ricercare con google, dato che non riesco a trovare nemmeno un esempio su come ricercare una stringa all'interno di un file. Magari avreste voi da suggerirmi qualche link?
Thx! RaouL. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
ho un piccolo grande dubbio:
Codice:
struct dati
{
int codice;
char cognome[40];
char nome[40];
char cfs[17]; /*per il codice fiscale*/
char ddn[11]; /*per la data di nascita*/
} anagraf;
Codice:
struct dati
{
int codice;
char cognome[40];
char nome[40];
char cfs[17]; /*per il codice fiscale*/
char ddn[11]; /*per la data di nascita*/
} anagraf[100];
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
rispondo ad una domanda che hai fatto sopra:
più è strutturato e gerarchizzato il codice più è leggibile correggibile e manipolabile ma meno è veloce. il fatto è che di solito il beneficio che hai a strutturare è di gran lunga maggiore della perdita di velocità che per esempi come questo è irrisoria. la strutturazione è inevitabile. però in certi casi si possono sostituire le istruzioni con macro che visivamente permettono di impostare il programma come strutturato ma poi di fatto verranno prima della compilazione espanse, cioè ad ogni occorrenza della macro verrà sostituito il codice relativo e POI il programma verrà compilato |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:34.




















