Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-09-2004, 16:34   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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*/
Ecco, questo è quello che sono riuscito a fare fino ad ora, ma, sonjo arrivato ad un punto morto. Il libro dal quale sto tentando di imparare qualcosa, è una guida al linguaggio C di Apogeo ma, ho letto spesso che ad esempio la funzione gets() andrebbe evitata e preferire la funzione fgets(); Beh, su quel libro ci sono solo e sempre esempi con gets()!!! fgets() la definisce e fa solo un esempio!!!

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.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 19:24   #2
Dun
Senior Member
 
L'Avatar di Dun
 
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!!
Dun è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 19:45   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Dun
Son di fretta quindi saro' telegrafico:

Il prototipo delle funzioni serve se le aggiungi dopo il main; il prototipo del main non serve.
Ok, grazie

Quote:
Organizza il flusso di esecuzione in uno switch, piu elegante e comprensibile.
Ci volevo provare, ma ancora non ho capito come fare

Quote:
Cerca di porganizzare il codice in microfunzioni, ne guadagni di leggibilita'.
Ho letto qualcosa a riguardo, ma credo che al momento sia ancora fuori dalla mia portata ma grazie tanto per la dritta

Quote:
Al posto di fget ce' sempre scanf che specifica il tipo di dato inserito.
mmmmm.... nel codice che ho scritto, dove ho messo la fgets(), in che modo avrei potuto usare la scanf() ? sinceramente non ho capito

Cya!! [/quote]
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 19:57   #4
Dun
Senior Member
 
L'Avatar di Dun
 
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
Scusa non avevo visto Errore mio per la scanf

Per i file si preferisce fwrite e fread
Dun è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 20:04   #5
Dun
Senior Member
 
L'Avatar di Dun
 
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;
}
Dun è offline   Rispondi citando il messaggio o parte di esso
Old 14-09-2004, 09:26   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 14-09-2004, 15:10   #7
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2004, 11:37   #8
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
un piccolo up
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2004, 00:46   #9
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Un piccolo aiutino per fare un controllo se uno dei campi già esiste?
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2004, 17:11   #10
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
up!
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 18-09-2004, 16:28   #11
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
up
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 19-09-2004, 14:06   #12
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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....*/
Ma succede che quando vado a compilare, mi da:
Codice:
gcc -Wall fileprova.c -o prova

error: incompatible type for argument 1 of 'write'
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 19-09-2004, 16:11   #13
Dun
Senior Member
 
L'Avatar di Dun
 
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
Quote:
Originariamente inviato da RaouL_BennetH


fwrite(&anagraf, sizeof(anagraf), 1, fp);
Prova cosi'
Dun è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2004, 11:40   #14
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Dun
Prova cosi'
Ciao Dun

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.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2004, 19:51   #15
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da RaouL_BennetH
Ciao Dun

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.
Ciao Raoul

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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2004, 20:34   #16
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da AnonimoVeneziano
Ciao Raoul

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
Ciao a te AnonimoVeneziano

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.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2004, 10:37   #17
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
up
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2004, 10:14   #18
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2004, 13:06   #19
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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;
se all'istanza della struttura 'anagraf', la dichiaro come array, cioè:

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];
ottengo che ogni 'anagraf' può contenere 100 elementi, oppure che ogni anagraf possa contenere 100 elementi ciascuno composto dal valore di array di ogni singolo elemento della struttura?
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2004, 15:00   #20
Black imp
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
Black imp è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
La capsula SpaceX Dragon CRS-33 ha acces...
La NASA è sempre più vicin...
Crisi delle memorie: ASUS torna al passa...
Le console next-generation potrebbero es...
Gemini cresce ancora: la quota di mercat...
Samsung sfida TSMC: la capacità produtti...
Iliad alza il prezzo della fibra ottica ...
Il prossimo low cost di POCO sarà il più...
The Elder Scrolls VI: ecco le ultime sul...
Ecco i saldi di fine anno Amazon, 34 off...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v