Torna indietro   Hardware Upgrade Forum > Software > Programmazione

SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto
SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto
Bravia 8 II rinnova l’eredità dell’A95L con maggiore luminosità e colori più precisi. Il taglio da 55” offre un’esperienza cinematografica immersiva anche in spazi ridotti, amplificata dalla soundbar Sony Theatre System 6
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo
KTC lancia il nuovo monitor gaming H27E6, un modello da 27 pollici che promette prestazioni estreme grazie al pannello Fast IPS con risoluzione 2K QHD (2560x1440). Il monitor si posiziona come una scelta cruciale per gli appassionati di eSport e i professionisti creativi, combinando una frequenza di aggiornamento di 300Hz e un tempo di risposta di 1ms con un'eccezionale fedeltà cromatica
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
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


SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto SONY BRAVIA 8 II e BRAVIA Theatre System 6: il c...
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo KTC H27E6 a 300Hz e 1ms: come i rivali ma a met&...
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Non ci sarà mai una Renault 5 ter...
The Game Awards 2025 in diretta su Prime...
ROG Strix Helios II è un mid-towe...
16 core in una scatolina di metallo: a t...
Chi l'ha detto che Windows 10 è m...
DREAME H14 Pro è la scopa elettrica lava...
Lego e Nintendo uniscono le forze per un...
Sfida tra giganti: realme GT7 vs Xiaomi ...
Linux non è così sicuro co...
Numeri da tripla A per ARC Raiders: supe...
Google rilascia il Pixel Drop di novembr...
Samsung Galaxy S26 Ultra: la ricarica sa...
Aira lancia la gamma Power: inverter e b...
Super sconti su rasoi elettrici e regola...
Cooler Master QUBE 540: compatto s&igrav...
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: 11:34.


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