Qui si usa Linux
struct tm *local;
time_t t;
time(&t);
local=localtime(&t);
printf("%02d/%02d/%02d",local->tm_mday,local->tm_mon+1,local->tm_year+1900);
--
************** (.)_(.) *******************
Un amico è uno che sa tutto di te e,
nonostante questo, gli piaci
(E. Hobbard)
> Possibile che sia tanto complicato mettere su due righe per far funzionare
> date ed ore con #include <time.h> int tm_xxx; %a %A %x %X ecc. ecc.?
> Gli stessi autori Kernigham & Ritchie non si abbassano, nel loro libro
> "Il linguaggio C" a scrivere esempi in proposito.
Il KernighaN (con la enne) & Ritchie � notoriamente un testo poco adatto
per imparare il linguaggio anche per il fatto che � abbastanza scarno e
parco di esempi.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char *fmt_time(time_t t, char *buf, size_t bufsz, const char *fmt)
{
struct tm *ts;
ts = localtime(&t);
strftime(buf, bufsz, fmt, ts);
return buf;
}
int main()
{
char now[50]={0};
puts(fmt_time(time(0), now, sizeof now, "%d/%m/%Y %H:%M:%S"));
return 0;
}
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ab...@newsland.it
> Il KernighaN (con la enne) & Ritchie � notoriamente un testo poco adatto
> per imparare il linguaggio anche per il fatto che � abbastanza scarno e
> parco di esempi.
Non sono particolarmente d'accordo. Non sono *sicuramente* d'accordo sul
"notoriamente". Accetto la tua opinione, ma non e' che sia una cosa
universale tanto da giustificare il "notoriamente".
Anzi, il libro e' di per se considerato un modello di scrittura tecnica.
Gli esempi sono relativamente pochi, e' vero, ma sono sostanzialmente
tutti significativi e piuttosto realistici.
Le critiche al libro che trovo, personalmente, fondate sono due. La
prima riguarda quanto e' aggiornato il libro: resta il fatto che la
seconda edizione (quella normalmente disponibile) e' aggiornata a C89.
Dal momento che attualmente nessun compilatore per le maggiori
piattaforme e' completamente conforme a C99 (con la possibile eccezione
di SunStudio, dicono), la cosa potrebbe non essere drammatica.
Si fa sempre presto ad imparare C89 e poi "aggiornarsi" piano piano a
C99.
Sempre tenendo conto che, pur 10 anni dopo lo standard, non e'
verosimile aspettarsi implementazioni 100% conformi (anche se alcune
features sono ben supportate). Tutt'ora molto spesso con C si intende
implicitamente C89 (ovvero, buona parte del C che leggo e' di fatto
scritto per essere compatibile sia con C89 che con C99).
La seconda critica riguarda la didattica. K&R non ti culla. Va sempre
dritto al sodo e complessivamente presuppone un lettore che sappia
qualcosa in generale di programmazione[0] e/o sia piuttosto sveglio. Ma
si potrebbero muovere *esattamente* le stesse critiche a Knuth. The Art
of Computer Programming se sei pigro, svogliato e principiante *non* lo
affronti.
Personalmente, vorrei che esistessero piu' libri come K&R. Quando per
studiare un nuovo linguaggio, mi sparano 600 pagine di manuale in cui
cercherebbero pure di insegnarmi a programmare, in generale mi annoio
assai.
-----
[0] dove con "qualcosa" si intende qualcosa di molto astratto.
--
-riko
Quoto in pieno. Quanto è vero...
This is the online version of The C Book, second edition by Mike
Banahan, Declan Brady and Mark Doran, originally published by Addison
Wesley in 1991. This version is made freely available.
http://publications.gbdirect.co.uk/c_book/
Date and time:
http://publications.gbdirect.co.uk/c_book/chapter9/date_and_time.html
Concordo al 100%, io l'ho trovato ottimo.
Passare dal Java a C col K&R è stato completamente indolore
e molto rapido.
> Non sono particolarmente d'accordo. Non sono *sicuramente* d'accordo sul
> "notoriamente". Accetto la tua opinione, ma non e' che sia una cosa
> universale tanto da giustificare il "notoriamente".
Dico "notoriamente" perch� in pi� di dieci anni di frequentazione di
questo gruppo ho potuto constatare come molte persone non lo trovano
"agevole" per imparare il linguaggio e preferiscono altri testi un po' pi�
chiari e ricchi d'esempi. Personalmente non trovo lo stile del K&R uno
stile didattico, sicuramente non � scritto per insegnare ma per illustrare
che � una cosa diversa. Stessa critica si potrebbe muovere, ad esempio, al
Stroustrup per il C++. Personalmente ho trovato i testi di Lippman molto
pi� chiari ed esplicativi.
> Le critiche al libro che trovo, personalmente, fondate sono due. La
> prima riguarda quanto e' aggiornato il libro: resta il fatto che la
> seconda edizione (quella normalmente disponibile) e' aggiornata a C89.
Non lo � pienamente. La seconda edizione � stata pubblicata prima
dell'uscita dello standard, quindi per essere veramente aggiornata bisogna
corredarla degli errata corrige.
> Personalmente ho trovato i testi di Lippman molto
> pi� chiari ed esplicativi.
Per non parlare di quelli di Eckel, ovviamente. Comunque aggiungo che non
ho mai affermato che il K&R non � un buon libro (per cui condivido il tuo
desiderio che magari ve ne fossero di pi� di libri del genere), dico solo
che da quel che ho potuto constatare e dall'impressione che ho avuto
leggendo entrambe le edizioni, non mi � sembrato possedere un'impostazione
didattica.
> "Tantumergo" <spacca...@katamail.com> ha scritto nel messaggio
> news:op.u220ondw2nngeq@localhost...
>> Possibile che sia tanto complicato mettere su due righe per far
>> funzionare
>> date ed ore con #include <time.h> int tm_xxx; %a %A %x %X ecc. ecc.?
>
>
> struct tm *local;
> time_t t;
> time(&t);
> local=localtime(&t);
> printf("%02d/%02d/%02d",local->tm_mday,local->tm_mon+1,local->tm_year+1900);
>
>
Molto bene. Questa non solo funziona (con inclusioni main e parentesi
graffe), ma è un
meraviglioso gioco enigmistico da risolvere. Grazie.
--
Qui si usa Linux.
http://www.puppylinux.org
http://www.opera.com/browser
> #include <stdio.h>
> #include <stdlib.h>
> #include <time.h>
> char *fmt_time(time_t t, char *buf, size_t bufsz, const char *fmt)
> {
> struct tm *ts;
> ts = localtime(&t);
> strftime(buf, bufsz, fmt, ts);
> return buf;
> }
> int main()
> {
> char now[50]={0};
> puts(fmt_time(time(0), now, sizeof now, "%d/%m/%Y %H:%M:%S"));
> return 0;
> }
Anche questa funziona. C'era quella "struct" che doveva essere proprio
"strutturata" per funzionare. Come costruirsi una nave dopo aver visto
solo un salvagente :-). Grazie.
> Molto bene. Questa non solo funziona (con inclusioni main e parentesi
> graffe), ma è un
> meraviglioso gioco enigmistico da risolvere. Grazie.
bastava una ricerchina con google eh.
Ciao Jack
> Tantumergo ha scritto:
..omissis..
>
> This is the online version of The C Book, second edition by Mike
> Banahan, Declan Brady and Mark Doran, originally published by Addison
> Wesley in 1991. This version is made freely available.
> http://publications.gbdirect.co.uk/c_book/
> Date and time:
> http://publications.gbdirect.co.uk/c_book/chapter9/date_and_time.html
Molto bene. Grazie mille.
Non sono bastate le ricerche su Google; è stato invece utile il news-group.
Saluti.
> Tantumergo wrote:
>> Molto bene. Questa non solo funziona (con inclusioni main e parentesi
>> graffe), ma è un
>> meraviglioso gioco enigmistico da risolvere. Grazie.
>
> gioco enigmistico? Ma dove? Sta stampando 3 variabili che sono membro di
> una struct ben documentata...
>
Per "color che sanno" sono tre variabili ben strutturate.
Per gli altri un rompicapo. A proposito:
Per fare una nuova directory col C bisogna rassegnarsi
a 'system("mkdir /dir"); o c'è un modo meno dipendente
dal sistema operativo sottostante il C.? Ho trovato tra le varie funzioni
una "creat" che forse potrebbe funzionare, se ben strutturata,
da "mkdir". Ma come strutturarla? Saluti.
|
| Broken-down time is stored in the structure tm which is
|defined in
| <time.h> as follows:
|
| struct tm {
| int tm_sec; /* seconds */
| int tm_min; /* minutes */
| int tm_hour; /* hours */
| int tm_mday; /* day of the month */
| int tm_mon; /* month */
| int tm_year; /* year */
| int tm_wday; /* day of the week */
| };
---------------------------------------------
Perché qui sotto c'è questo "error": redefinition of 'struct tm'?
#include <stdio.h>
#include <time.h>
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
int main()
{
int tm_hour;
printf("%d",tm_hour);
}
> Per fare una nuova directory col C bisogna rassegnarsi a
> 'system("mkdir /dir"); o c'è un modo meno dipendente dal sistema
> operativo sottostante il C.? Ho trovato tra le varie funzioni una
> "creat" che forse potrebbe funzionare, se ben strutturata, da
> "mkdir". Ma come strutturarla? Saluti.
Nei sistemi POSIX c'è la funzione mkdir() che IMO fa una system call.
Non credo che, sempre restando nei sistemi POSIX, sia possibile farlo
usando la creat().
Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
< http://giovanni.homelinux.net/ >
> Perché qui sotto c'è questo "error": redefinition of 'struct tm'?
> #include <stdio.h>
> #include <time.h>
> struct tm {
> int tm_sec; /* seconds */
> int tm_min; /* minutes */
> int tm_hour; /* hours */
> int tm_mday; /* day of the month */
> int tm_mon; /* month */
> int tm_year; /* year */
> int tm_wday; /* day of the week */
> int tm_yday; /* day in the year */
> int tm_isdst; /* daylight saving time */
>
> };
>
> int main()
> {
> int tm_hour;
> printf("%d",tm_hour);
> }
Perché la struttura tm è già definita in <time.h>.
Quello che devi fare è allocare un puntatore ed inizializzarlo con una
chiamata a localtime() o gmtime(). L'area di memoria ritornata dalla
chiamata è strutturata come definito da 'struct tm' e correttamente
inizializzata.
#include <stdio.h>
#include <time.h>
int main()
{
struct tm *dateInfo;
time_t now;
now = time(NULL);
dateInfo = localtime(&now);
printf("Date is %02d/%02d/%2d, time is %02d:%02d:%02d \n",
dateInfo->tm_day,
dateInfo->tm_mon,
dateInfo->tm_year,
dateInfo->tm_hour,
dateInfo->tm_min,
dateInfo->tm_sec);
return 0;
|..omissis...
#include <stdio.h>
#include <time.h>
int main()
{
struct tm *dateInfo;
time_t now;
now = time(NULL);
dateInfo = localtime(&now);
const int oggi='dateinfo->tm_yday';
printf("E' il %02d/%02d/%2d e sono le ore %02d:%02d:%02d.\n",
dateInfo->tm_mday,
dateInfo->tm_mon,
dateInfo->tm_year,
dateInfo->tm_hour,
dateInfo->tm_min,
dateInfo->tm_sec);
printf("E' il %d%s\n",oggi,"° giorno dell'anno" );
return 0;
}
Questa cosa funziona parzialmente. Ho visto con piacere che sono
riuscito a mettere gli elementi della data sotto variabile ("oggi") così
da poterli usare non solo per rivedere il calendario corrente, ma anche
per farci, domani, qualche calcolo. Purtroppo esce in formato
timestamp... Cosa che non succede nel sostituire una qualsiasi 'tm_xxx'
nella prima printf la quale, tuttavia si ostina a dare errore
fatale quando tento di aggiungerne qualcuna alle sei che già sopporta.
Manovrando in tutti i modi le specifiche '%d'.
Saluti.
--
Qui si usa Linux.
http://www.puppylinux.org
http://digilander.libero.it/puppylinuxitalia/
22/11/2009 ore 18:35:06
> Per "color che sanno" sono tre variabili ben strutturate.
> Per gli altri un rompicapo. A proposito:
basta leggere il manuale.
> Per fare una nuova directory col C bisogna rassegnarsi
> a 'system("mkdir /dir"); o c'è un modo meno dipendente
> dal sistema operativo sottostante il C.? Ho trovato tra le varie funzioni
> una "creat" che forse potrebbe funzionare, se ben strutturata,
> da "mkdir". Ma come strutturarla? Saluti.
funzioni POSIX.
Ciao Jack
Prima di iniziare a preoccuparti della data dovresti studiare meglio
il linguaggio.
> #include <stdio.h>
> #include <time.h>
>
> int main()
> {
> struct tm *dateInfo;
> time_t now;
>
> now = time(NULL);
> dateInfo = localtime(&now);
> const int oggi='dateinfo->tm_yday';
Non puoi dichiarare una variabile in questo punto e non può essere di
tipo const. A che servono gli apici che racchiudono dateinfo->tm_yday?
Il nome del puntatore è dateInfo non dateinfo. La differenza
maiuscole/minuscole è una delle prime cose che ti insegnano in un
corso di C.
> printf("E' il %02d/%02d/%2d e sono le ore %02d:%02d:%02d.\n",
> dateInfo->tm_mday,
> dateInfo->tm_mon,
> dateInfo->tm_year,
> dateInfo->tm_hour,
> dateInfo->tm_min,
> dateInfo->tm_sec);
>
>
> printf("E' il %d%s\n",oggi,"° giorno dell'anno" );
> return 0;
> }
>
> Questa cosa funziona parzialmente. Ho visto con piacere che sono
> riuscito a mettere gli elementi della data sotto variabile ("oggi") così
Peccato che non possa funzionare per quanto ho scritto sopra :-(
> da poterli usare non solo per rivedere il calendario corrente, ma anche
> per farci, domani, qualche calcolo. Purtroppo esce in formato
> timestamp... Cosa che non succede nel sostituire una qualsiasi 'tm_xxx'
> nella prima printf la quale, tuttavia si ostina a dare errore
> fatale quando tento di aggiungerne qualcuna alle sei che già sopporta.
> Manovrando in tutti i modi le specifiche '%d'.
Studia dall'inizio non partire dalla fine.
|Non puoi dichiarare una variabile in questo punto e non può essere di
|tipo const. A che servono gli apici che racchiudono dateinfo->tm_yday?
|
|Il nome del puntatore è dateInfo non dateinfo. La differenza
|maiuscole/minuscole è una delle prime cose che ti insegnano in un
|corso di C.
..omissis...
|
|Studia dall'inizio non partire dalla fine.
int main()
{
struct tm *dateInfo;
time_t now;
now = time(NULL);
dateInfo = localtime(&now);
int oggi=dateInfo->tm_yday;
printf("E' il %02d/%02d/%2d e sono le ore
%02d:%02d:%02d.\n", dateInfo->tm_mday,
dateInfo->tm_mon,
dateInfo->tm_year,
dateInfo->tm_hour,
dateInfo->tm_min,
dateInfo->tm_sec);
printf("E' il %d%s\n",oggi,"° giorno dell'anno" );
return 0;
}
Funziona. Anche se continuo a dichiararla in quel punto, dopo
l'entrata in gioco di "dateInfo" (o no?).
Dal momento che così riesco finalmente a catturare l'output dello
scritto in una variabile considero il fatto come un buon inizio.
Adesso voglio vedere come è possibile usarla per realizzare,
magari, una specie di rozzo calendario, attraverso gli operatori
aritmetici.
Lo studio deduttivo presuppone un libro di testo. Ho il
Kernighan&Ritchie più diversi tutorial on-line in inglese.
Ma in questo campo come in molti altri credo che qualche
esempio (cioè il contributo del paziente maestro) sia essenziale
per entrare in sintonia col discorso teorico del libro.
Altrimenti si incontrerebbero le stesse difficoltà di
chi fosse determinato a farsi esperto di botanica senza
aver mai visto un albero.
Grazie e saluti.
--
Qui si usa Linux.
http://www.puppylinux.org
http://digilander.libero.it/puppylinuxitalia/
23/11/2009 ore 15:09:39
te ti devi leggere un buon libro di C e poi uno sulle chiamate di
sistema della piattaforma utilizzata.
Ad esempio unistd definisce mkdir come:
int mkdir (const char *filename, mode_t mode)
dove filename è il nome della directory che vuoi creare e mode sono dei
flag ossia degli attributi che concateni con una or che definiscono i
permessi ad esempio per creare un dir con permessi di lettura,
scrittura, esecuzione (che per una dir significa listing) su linux fai:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
....
....
....
if ( -1 == mkdir('nuova_dir', S_IRWXU) )
{
// gestisci errore
}
else
{
// tutto ok
}
la directory viene creata nella working directory.
micheg
int oggi; /* dichiarato qui prima di ogni altro statementt */
>
> now = time(NULL);
> dateInfo = localtime(&now);
> int oggi=dateInfo->tm_yday;
oggi = dateInfo->tm_yday; /* qui puoi usare oggi */
> printf("E' il %02d/%02d/%2d e sono le ore
> %02d:%02d:%02d.\n", dateInfo->tm_mday,
> dateInfo->tm_mon,
> dateInfo->tm_year,
> dateInfo->tm_hour,
> dateInfo->tm_min,
> dateInfo->tm_sec);
>
>
> printf("E' il %d%s\n",oggi,"° giorno dell'anno" );
Bruttissimo.
printf ("E' il %d° giorno dell'anno", oggi);
od anche senza usare una variabile inutile
printf ("E' il %d° giorno dell'anno", dateInfo->tm_yday);
> return 0;
> }
>
> Funziona. Anche se continuo a dichiararla in quel punto, dopo
> l'entrata in gioco di "dateInfo" (o no?).
No. Il fatto è che le variabili devono essere dichiarate prima di
qualsiasi statement del blocco. Non è che stai compilando in modalità
c++?
> Dal momento che così riesco finalmente a catturare l'output dello
> scritto in una variabile considero il fatto come un buon inizio.
> Adesso voglio vedere come è possibile usarla per realizzare,
> magari, una specie di rozzo calendario, attraverso gli operatori
> aritmetici.
>
> Lo studio deduttivo presuppone un libro di testo. Ho il
> Kernighan&Ritchie più diversi tutorial on-line in inglese.
> Ma in questo campo come in molti altri credo che qualche
> esempio (cioè il contributo del paziente maestro) sia essenziale
> per entrare in sintonia col discorso teorico del libro.
> Altrimenti si incontrerebbero le stesse difficoltà di
> chi fosse determinato a farsi esperto di botanica senza
> aver mai visto un albero.
Ciao
int main()
{
int oggi,anni,nascita;
struct tm *data;
time_t now;
now = time(NULL);
data = localtime(&now);
oggi=data->tm_yday;
nascita=1945;
anni=data->tm_year+1900-nascita;
printf("E' il %02d/%02d/%2d,\n",
data->tm_mday,
data->tm_mon,
data->tm_year+1900);
printf("%d° giorno dell'anno.\n",oggi);
printf("Sono le ore %02d:%02d:%02d,\n",
data->tm_hour,
data->tm_min,
data->tm_sec);
printf("mancano %02d giorni a Natale\n",359-1-oggi);
printf("ed ho già %d anni.\n",anni);
return 0;
}
Saluti.
.
--
Qui si usa Linux.
http://www.puppylinux.org
http://digilander.libero.it/puppylinuxitalia/
24/11/2009 ore 06:31:03
>
Funziona. All'osso così:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
mkdir("/dir/nuovadir", S_IRWXU);
}
Grazie mille e buone feste.
--
Qui si usa Linux
http://www.puppylinux.org