Newsgroup: it.comp.lang.c
Titolo: Lettura caratteri da file

Ebbene si purtroppo ho ancora bisogno del vostro aiuto. ( e chissà quante
altre ne avrò ancora bisogno ;-P)
Dovrei creare un programmino che, definito un file di testo, lo apra in
lettura, ne conti i caratteri totali e mi dica per ogni lettera
dell'alfabeto quante volte è ripetuto il carattere.
Io ho provato in questo modo 
http://nopaste.info/index.php?id=2030c449bb
, ma
mi riporta un numero di volte per i singoli caratteri sbagliati.
Ho provato a rifarlo diverse volte ma non riesco a capire dove possa essere
l' errore.
Se non erro mi conta la metà delle volte che un carattere compare, es se la
a nel file è contenuta 26 volte il programma mi riporta 13.
Grazie ancora del vostro aiuto.
Ciao Morpheus.

 dell'alfabeto quante volte è ripetuto il carattere.
Mi dispiace, ma il tuo programma e' troppo lontano dai miei
gusti (leggi il file da capo per ogni carattere!!!) e non ho la
forza di debuggarlo.
Perche' mai non lo scandisci una volta sola, ad esempio cosi':
#include<stdio.h>
#include<stdlib.h>
/* passo il nome del file come primo argomento
sulla linea di comando */
int main(int argc, char *argv[])
{
   FILE *f;
   int i, cnt[256], c;
   if (argc<2) exit(1);
   f=fopen(argv[1],"r");
   if (!f) exit(1);
   for (i=0; i<256; i++) cnt[i]=0;
   while ((c=fgetc(f))!=EOF) cnt[c]++;
   fclose(f);
   /* caratteri a-z e A-Z */
   for (i='a'; i<='z'; i++)  printf("%c -> %d\n",i,cnt[i]);
   for (i='A'; i<='Z'; i++)  printf("%c -> %d\n",i,cnt[i]);
   return 0;
}
ciao,
g.

 Perche' mai non lo scandisci una volta sola, ad esempio cosi':
Perchè sono niubbo, perchè fino a circa un mese fa l'unica cosa che
programmavo era un videoregistratore ( e nemmeno molto bene) e perchè oltre
a la conoscenza del linguaggio, mi manca l' esperienza.
Certo il tuo programma è molto più intelligente e logico del mio, ma non
credo che tu sia un mese che programmi....
Magari avessi la tua conoscenza e la tua esperienza....
Cmq grazie mille sei stato gentile.
Ciao Morpheus.

 credo che tu sia un mese che programmi...
Sfortunatamemente (avendo compiuto i 41 da pochi giorni) sono circa 27 
anni che programmo in un modo o nell'altro , ma non mi ritengo un gran
programmatore.
In effetti imparare un linguaggio, come un insieme di regole 
sintattiche, non e' una cosa difficile. Di solito il difficile
consiste nel decidere l'algoritmo da usare per risolvere
un dato problema, cercando di tenere
presente in un angolino del cervello che di tanti algoritmi possibili
alcuni saranno piu' o meno efficienti e saranno piu' o meno
facilmente traducibili nel linguaggio che stiamo usando.
All'inizio la parte che consiste nel tradurre il tuo algoritmo
in C sara' quella che ti sembra piu' difficile poi con il crescere
della complessita' dei problemi e avendo acquisito una certa
esperienza nel programmare, sara' la parte di analisi quella piu'
impegnativa.
ciao,
g.

 g.
Concordo pienamente !!!
Ciao e grazie dell' aiuto
Morpheus
p.s. non č che quando hai tempo e voglia, dai un'occhiata al mio
pseudoprogrammino, per vedere qual'č l'errore (scusa, ma odio non capire una
cosa ;-P)
Grazie ancora

 Perche' mai non lo scandisci una volta sola, ad esempio cosi':
<snip>
Il mio è più bello ;-) :
#include <stdio.h>
#define M main
#define W while
#define G getchar 
#define P printf
#define F for 
int M(){int
c,i=0,o[256]={0};W((c=G())!=EOF)o[c]++;F(;i<256;i++)if(o[i])P("o[%d]=%d\n",i,o[i])}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Ma un pò incasinato per noi niubbi ;)
Ciao Morpheus

 cosa ;-P)
Be' un grave problema salta subito all'occhio:
tu fai due cicli di questo tipo:
while (fgetc(fp1) != EOF)
    {
       if (fgetc(fp1) == i)
       r++;
    }
nella while leggi un carattere e poi lo butti
(lo usi solo per vedere se hai raggiunto EOF) e poi
ne leggi un altro per confrontarlo con i.
In pratica conteggi un carattere ogni due.
ciao,
g.

 g.
Quindi dopo il while avrei dovuto mettere direttamente la condizione di
scelta del carattere, perchè lui lo aveva già scansionato con il primo
fgetc, giusto ?
Grazie ancora
Ciao Morpheus

 chi chede aiuto.
Smettila imbecille.



Si, ma dovevi memorizzarlo in un intero, altrimenti lo perdevi, tipo>
int c;
while ( (c=fgetc(fp1)) != EOF )
{
    if (c==i)  r++;
}
o se preferisci:
while (1)
{
    c = fgetc(fp1);
    if (c==EOF) break;
    if (c==i) r++;
}
o ancora
while (!feof(fp1))
{
    c=fgetc(fp1);
    if (c==i) r++;
}
Questo ultimo esempio puo' essere pericoloso, se uno lo
modifica senza ricordarsi che feof() controlla se si
e' raggiunta la fine del file, ma se ne accorge solo
se si e' tentata una lettura OLTRE la fine del file.
Ovvero, nel mio programmino, se avessi scritto invece di
while ( (c=fgetc(fp1)) != EOF ) cnt[c]++;
qualcosa del tipo
while (!feof(fp1))
{
    c=fgetc(fp1);
    cnt[c]++;
}
avrei commesso un errore grave. Infatti, dopo aver letto l'ultimo 
carattere valido dal file la feof() ancora non mi dice di aver
raggiunto la fine. Entrerei quindi nel ciclo e leggerei un carattere
c = EOF che siccome di solito e' un valore tipo -1, mi farebbe sballare
di brutto il programma mentre faccio cnt[EOF]++.
In questo esempio che ti avevo fatto sopra la cosa funziona
comunque perche' il risultato della fgetc viene confrontato
con i e quindi un eventuale valore EOF non causa problemi:
while (!feof(fp1))
{
    c=fgetc(fp1);
    if (c==i) r++;
}
Scusa se ti ho detto questa cosa che non mi hai chiesta, ma eravamo in
tema, e nella mia esperienza su questo gruppo direi che la maggior parte 
dei problemi di gestione file dipendende da 2 cose
1) equivocazione del significato di feof()
2) il fatto che sotto dos/windows e' diverso aprire un file in modalita' 
testo oppure binaria.
ciao,
g.

 Ma un pò incasinato per noi niubbi ;)
Incasinato??... tu dici ?! ;-)...


 testo oppure binaria.
FANTASTICO !!! semplicemente FANTASTICO !!!
Non ti devi scusare, anzi siamo noi niubbi che ti RINGRAZIAMO per la
spiegazione...
Purtroppo se non ci fosse gente come te noi principianti ci metteremo mille
anni a capire i nostri errori, grazie ancora e buon lavoro.
Ciao Morpheus


bhč diciamo che a prima vista non risulta molto semplice, soprattutto la
formattazione del codice ( si dice cosě ?), bisogna guardarlo una o 2 volte
in piů.
Ciao.
Morpheus

 Smettila imbecille.
Scusate la mia intrusione in una conversazione personale, ma è una cosa che
volevo già scrivere un paio di post fa  e che fino ad ora ho risparmiato.
Vorrei solo sapere perchè due persone ingamba come voi nella programmazione
( e sono sicuro anche in altre cose ) al posto che essere uniti nelle
risposte a noi newbies, anche con delle precisazioni l' un l' altro per
carità, vi insultiate un post si e uno no.
Io personalmente devo ringraziare entrambi per l' aiuto che mi state dando
e, entrato da poco in questo ng, è come se mi fossi aggiunto ad una
compagnia di amici che hanno gli stessi interessi e condividono le stesse
informazioni. Personalmente mi dispiace che cisiano queste discussioni su
"io sono più bravo di te, tu sei nessuso ecc...", siete grandi tutti e due,
non c'è (mai) uno più bravo o meno bravo, ma chi conosce meglio una cosa
dell'altro e, fa piacere che questa persona condivida la sua conoscenza con
gli altri.
Non so più chi ha detto " Non vi è vero progresso, finchè una nuova
tecnologia non è alla portata di tutti", forse un certo Ford. Anche se la
frase non centra nulla, la morale è azzeccata in pieno.
Ciao ragazzi e mi raccomando noi "pivelli" contiamo su di voi ;-P
Morpheus

 Morpheus
Lascialo perdere, e` un ben noto TROLL.


 bhè diciamo che a prima vista non risulta molto semplice
:-) ovvio che stavo scherzando (c'era una faccina) ;-)
E' un tipico esempio di come NON scrivere codice C ;-)


 in piů.
comunque Laf. e' stato buono.
A parte alcuni #define per sostituire alcune parole chiave del 
linguaggio con abbreviazioni di una lettera (M,F, etc.)
non ha usato cose esoteriche.
una cosa utile che ha usato e' questa:
int o[256]={0};
in pratica serve ad inizializzare l'array o[256] tutto a 0.
Infatti se non ci sono abbastanza (qui ce ne vorrebbero 256) valori
espliciti nella inizializzazione gli altri vengono messi a 0. Quindi
qui essendocene solo 1 tutti gli elementi del vettore vengono posti a 0.
Volendo avrebbe potuto anche scrivere
o[256]={};
Comunque se sei curioso di vedere utilizzi molto piu'
bastardi del C, c'era addirittura un apposito concorso.
I programmi dei partecipanti li puoi trovare qui:
http://www.de.ioccc.org/years-spoiler.html
mentre alcuni sono commentati qui:
http://remus.rutgers.edu/~rhoads/Obfuscated_C/obfuscate.html
Tra i classici per esempio c'e questo programma
int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,
f[b]=d%--g,d/=g--,--b;d*=b);}
che stampa il valore di Pigreco (3.14....) con 800 decimali esatti.
In questo caso ad essere complicato e' l'algoritmo che ci sta dietro,
piu' che la sintassi.
ciao,
g.

 "io sono più bravo di te, tu sei nessuso ecc...",[...]
Caro Morpheus, a parte che frequentare lo stesso gruppo di discussione non
significa in alcun modo "essere amici", posso dirti che, personalmente,
non ho alcuna voglia di dimostrare di essere più bravo di altri.  Non è
questo lo spirito con cui scrivo i miei post.  Io aiuto (da sempre) in
questo gruppo chi chiede aiuto, senza alcun secondo fine.  Che poi ci sia
un imbecille come Giovanni che scrive frasi come quelle che scrive, in
risposta ai miei messaggi, è solo qualcosa per cui provare pena.  Non è
evidentemente capace di  argomentare tecnicamente e quindi pensa di
difendersi a questo modo.  Penoso, ma di gente così sui gruppi se ne
incontra tanta...


 
http://www.de.ioccc.org/years-spoiler.html
Uno dei più belli che abbiano mai partecipato al contest era il gioco
"reversi".  Il codice era scritto a forma di scacchiera ;-)


 carità, vi insultiate un post si e uno no.
Perche Andrea e` un presuntuoso ed ho fatto una volta l'errore di 
controbattere una sua affermazione.  Da quel momento non fa che offendermi.
Perche` e` un TROLL


 Perche` e` un TROLL
Non sai neanche che cosa significa questa parola, cazzone che non sei
altro.
Ti invito a girare per altri gruppi e vedere _chi_ realmente si comporta
da troll.  Tu sei un minchione al quale vengono fatti notare gli errori e
si offende come un bimbo a cui abbiano rubato la merendina.  E' facile,
per gli idioti come te dare del "presuntuoso".  Sģ, ti offendo perché sei
un cazzone e se lo vuoi sapere provo un gusto sadico nel farlo, quindi
dammene motivo e continuerņ a darti del coglione, idiota, imbecille e
quant'altro.


 --
Interessante, molto interessante, grazie ragazzi
Ciao
Morpheus

 quant'altro.
Calma ragazzi, calma...... ecche diamine, sono daccordo che ognuno ha le
proprie idee, ma si possono esprimere in modo un pochino piů educato.
Io cercavo soltanto di mettere un tantino di pace tra voi due, ma siete
tosti eh !
Puň succedere di avere delle divergenze o svolgere un programma con un
algoritmo piuttosto che con un altro, ma non per questo bisogno offendere.
Certo se poi uno dice una cavolata č giusto che venga corretto per non dare
informazioni sbagliate, e non penso ci si possa offendere se uno viene
corretto, NESSUNO SA' TUTTO, tutti commettiamo degli errori.
Dai su un piccolo sforzo e almeno cercate di non offendervi.
Poi, noi principianti siamo tanti e voi professionisti pochi, quindi mettete
da parte il presuntuosismo e continuate ad aiutarci come avete fatto fino ad
oggi, senza incazzarvi uno con l' altro.
Ciao ragazzi e buon lavoro.
Morpheus

 oggi, senza incazzarvi uno con l' altro.
"Presuntuosismo" ? bella parola, bisognerebbe aggiungerla al dizionario.  
Con tutto il rispetto, limitati, in questo gruppo, a discutere di C, non
dare lezioni di comportamento agli altri.  Se una persona sbaglia e non
ammette di avere sbagliato, si arrampica sui vetri, si ostina a non voler
capire, comincia a sparare cazzate e quant'altro, io sono libero di dargli
del coglione, senza per questo peccare di presunzione.


 del coglione, senza per questo peccare di presunzione.
Ok lascio perdere, primo perchè non volevo dare nessuna lezione di
comportamento, secondo perchè da come mi hai risposto forse Giovanni non ha
tutti i torti. Dovevo farmi gli affari miei.
Ognuno la pensa come vuole. Hai ragione tu e sei libero di comportarti come
credi.
Ciao Morpheus

 tutti i torti. Dovevo farmi gli affari miei.
Benvenuto nell'allegro mondo dei NG.
Stai attento... Per quanto riguarda il "C", se c'e' una
divergenza di vedute tra Giovanni e Laforgia, ci sono
ottime probabilita' che ad avere ragione sia Laforgia.
Poi sei libero di dare retta a chi ti pare.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 C:\>iao Angelo
Ti ringrazio del benvenuto e del consiglio lo terrò a mente.
Per la mia conoscenza del C sono in gamba entrambi, e proverò senz'altro
entrambe le soluzioni, se risponderanno entrambi ha i miei quesiti.
Ciao Angelo.
Morpheus

 [...] da come mi hai risposto forse Giovanni non ha tutti i torti.
Sei libero di pensarla come vuoi.  Fai attenzione, però.



Andrea Laforgia e` presuntuoso represso che se lo riprendi perche` ha 
sbagliato, dicendo di ripassare un bel manuale, non riesce ad 
ammetterlo.  E deve sfogarsi dando dell'idiota, del deficiente o del 
coglione senza neanche sapere con chi sta parlando.
Avra` pure una grande esperienza di C (e non lo metto in dubbio) ma e` 
anche una grande MALEDUCATO.  Sono anni che frequento NG ma mai mi era 
capitato di incontrare una persona che sa solo offendere.
Se pensassi di ottenere un responso positivo, gli consiglierei di fare 
un bel respiro, una bella doccia gelata e poi riflettere a tutte le 
offese gratuite che ha scritto.  Forse si renderebbe conto che una 
persona normale potrebbe anche chiedere scusa.  Ma credi che la 
piantera` senza dire l'ultima?
Ciao
Giovanni


 Sei libero di pensarla come vuoi.  Fai attenzione, perň.
Non era riferito al C, ma sul fatto della presunzione:
parole tue:
"Presuntuosismo" ? bella parola, bisognerebbe aggiungerla al dizionario.
Con tutto il rispetto, limitati, in questo gruppo, a discutere di C, non
dare lezioni di comportamento agli altri.
Lo sň che la parola "presuntuosismo" non esiste in nessun dizionario era
solo per far capire il senso del discorso.
Mi piacerebbe discutere sul C, ma non ne sono ancora in grado e mi limito
solo a chiedere consigli.
Cmq segurň il tuo consiglio e posterň solo domande inerenti al C ( se no sta
discussione non finisce piů).
Ciao e buona serata.
Morpheus

  Ma credi che la piantera` senza dire l'ultima?
Certo che no, perché dovrei, cazzone ?


 Cmq segurņ il tuo consiglio e posterņ solo domande inerenti al C
Trattandosi di it.comp.lang.c credo che sia cosa buona e giusta.
