Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
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


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Il nuovo Snapdragon 8 Elite Gen 6 sar&ag...
Nintendo Switch 2: risultati sotto le at...
Weekend con tante sorprese su Amazon: to...
HONOR non si ferma più: il 2025 &...
Speciale best seller: EUREKA J15 Evo Ult...
Roborock Q10 X5+ da 10.000 Pa a 199€ &eg...
E-mail reset password di Instagram: la c...
La NASA ha discusso le problematiche del...
Il razzo spaziale NASA SLS e la capsula ...
Stazione Spaziale Internazionale: Crew-1...
Samsung Galaxy S26 Ultra: la ricarica de...
Apple ha un nuovo partner per la sua App...
Trenitalia introduce il prezzo dinamico ...
OnePlus non si ferma più: c'&egra...
DAZN sconta il piano Full per 6 mesi, se...
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: 21:17.


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