Newsgroup: it.comp.lang.c++
Titolo: importare frasi da file (lungo)

Salve, vorrei un aiuto per un programma che vorrei scrivere in C++.
Il problema e' che voglio copiare delle parole separate da spazi da un
file e metterle in un array di caratteri, purtroppo pero' l'operatore
che utilizzo(>>)smette di leggere dal file quando incontra uno spazio.
Ho anche provato a usare la riga: while (!in.eof()) in>>parola. Dove
"in" sarebbe il canale di input da file e "parola" l'array di caratteri.
Ma in questo modo, non capisco perche', dentro a "parola" viene copiata
solo l'ultima parola dopo l'ultimo spazio.
Vi mando in attach il codice del mio programma (in formato .txt) che
serve a calcolare la percentuale con cui si presentano le lettere in una
frase.
Aiutatemi!
Grazie
         Riccardo Pavesi
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>
main()
{
clrscr();
int lung;
double
a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,vuo=0;
double
aa,bb,cc,dd,ee,ff,gg,hh,ii,jj,kk,ll,mm,nn,oo,pp,qq,rr,ss,tt,uu,vv,ww,xx,yy,zz,vuov;
ifstream in("f:\\conta\\Testo.txt");
ofstream out("f:\\conta\\Conteggio.txt");
char parola[2000];
//Questo e' il punto importante
in>>parola;
lung=strlen(parola);
for (int ind=0;ind<lung;ind++)
{
switch (parola[ind])
{
case 'a':
a++;
break;
case 'b':
b++;
break;
case 'c':
c++;
break;
case 'd':
d++;
break;
case 'e':
e++;
break;
case 'f':
f++;
break;
case 'g':
g++;
break;
case 'h':
h++;
break;
case 'i':
i++;
break;
case 'j':
j++;
break;
case 'k':
k++;
break;
case 'l':
l++;
break;
case 'm':
m++;
break;
case 'n':
n++;
break;
case 'o':
o++;
break;
case 'p':
p++;
break;
case 'q':
q++;
break;
case 'r':
r++;
break;
case 's':
s++;
break;
case 't':
t++;
break;
case 'u':
u++;
break;
case 'v':
v++;
break;
case 'w':
w++;
break;
case 'x':
x++;
break;
case 'y':
y++;
break;
case 'z':
z++;
break;
case ' ':
vuo++;
break;
}
}/*
int lun=lung-vuo;
out <<lun<<endl;
out<< a <<' '<<b<<' '<<c<<' '<<d<<' '<<e<<' '<<f<<' ';
out<<g<<' '<<h<<' '<<i<<' '<<j<<' '<<k<<' '<<l<<' '<<m<<' '<<n<<'
'<<o<<' ';
out<<p<<' '<<q<<' '<<r<<' '<<s<<' '<<t<<' '<<u<<' '<<v<<' '<<w<<'
'<<x<<' '<<y<<' '<<z<<"  "<<vuo;
aa=a/lun*100;
bb=b/lun*100;
cc=c/lun*100;
dd=d/lun*100;
ee=e/lun*100;
ff=f/lun*100;
gg=g/lun*100;
hh=h/lun*100;
ii=i/lun*100;
jj=j/lun*100;
kk=k/lun*100;
ll=l/lun*100;
mm=m/lun*100;
nn=n/lun*100;
oo=o/lun*100;
pp=p/lun*100;
qq=q/lun*100;
rr=r/lun*100;
ss=s/lun*100;
tt=t/lun*100;
uu=u/lun*100;
vv=v/lun*100;
ww=w/lun*100;
xx=x/lun*100;
yy=y/lun*100;
zz=z/lun*100;
vuov=vuo/lung*100;
out <<endl<<'a'<<aa<<' '<<'b'<<bb<<' '<<'c'<<cc<<' ';
out<<'d'<<dd<<' '<<'e'<<ee<<' '<<'f'<<ff<<' '<<'g'<<gg<<' '<<'h'<<hh<<'
'<<endl<<'i'<<ii<<' '<<'j';
out<<jj<<' '<<'k'<<kk<<' '<<'l'<<ll<<' '<<'m'<<mm<<' '<<'n'<<nn<<'
'<<'o'<<oo<<' '<<'p'<<pp<<' '<<endl;
out<<'q'<<qq<<' '<<'r'<<rr<<' '<<'s'<<ss<<' '<<'t'<<tt<<' '<<'u'<<uu<<'
'<<'v'<<vv<<'w';
out<<ww<<' '<<'x'<<xx<<' '<<'y'<<yy<<' '<<'z'<<zz<<"  "<<"spazi"<<vuov;
*/
for(int ad=0;ad<lung;ad++) cout<< parola[ad];
getch();
in.close();
out.close();
return 0;
}

solo l'ultima parola dopo l'ultimo spazio.
Usa std::getline.
Il Ghenio
---------
These are my parting words to you:
those who give up are doomed!

 those who give up are doomed!
grazie mille
      Paola

 frase.
Mi sa di cryptoanalisi ... state craccando un mess Cesareo ????
Ciao
Gaetano.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Mi sa di cryptoanalisi ... state craccando un mess Cesareo ????
no, io non ne so nulla, lui impara. ha letto codici e segreti di singh,
vuole confrontare le frequenze, tutto qua. ciao

 wrote in message

Ma come no? 
Allora ho indovinato. 
Buon lavoro.
Ciao
Gaetano
--
#exclude <windows>
printf("\t\t\b\b\b\b\b\b");.
printf("\t\t\b\b\b\b\b\b");


 Buon lavoro.
vuole decifrare una cifratura per sostituzione monoalfabetica di un
testo crittato proposto da "codici e segreti", anziche' contare le
lettere una ad una, ok? padrone di non credermi, figurati se gli faccio
vedere altro... per quel che mi importa, quell'altro, poi... mica sono
scema, ho capito cosa c'e'
   paola

 scema, 
*sono* scema, altroche' se lo sono, ma non sono *crudele*, specialmente
con le persone *innucenti* e *indifese*
     paola


mettiamoci un pietra sopra. bella grossa. un macigno.

      paola
Questa non l'ho capita, mica sarai una "BASTARDA DENTRO" ???
--


 ho capito cosa c'e'
????????????
--


 Questa non l'ho capita, mica sarai una "BASTARDA DENTRO" ???
un po' di sensi di colpa aiutano a crescere...
           Maria Goretti ;-)

Riccardo Pavesi wrote:
Scusa se mi intrometto ma non ho resistito; premetto che non risolvo il tuo 
problema ma, almeno, riscrivo il codice in maniera un po' piu' umana
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>
// dovrebbe bastare
#define DIMBUF 256
main()
{
clrscr();
int lung;
double a[DIMBUF],aa[DIMBUF];
for( int i = 0 ; i < DIMBUF ; i++ ) a[i]=0;
ifstream in("f:\\conta\\Testo.txt");
ofstream out("f:\\conta\\Conteggio.txt");
char parola[2000];
//Questo e' il punto importante
in>>parola;
lung=strlen(parola);
for (int ind=0;ind<lung;ind++)
        a[parola[ind]]++
/*
int lun=lung-parola[' '];
out <<lun<<endl;
for( int i = 'a' ; i <= 'z' ; i++ ) 
        out<< a[i] <<' ';
out << a[' '] << endl;  
for( int i = 0 ; i <= DIMBUF ; i++ ) 
        aa[i]=a/lun*100;
for( int i = 'a' ; i <= 'z' ; i++ ) 
        out << (char)i << ': '<< a[i] <<', ';
out << 'spazio: '<< a[' '] << endl;     
*/
for(int ad=0;ad<lung;ad++) cout<< parola[ad];
getch();
in.close();
out.close();
return 0;
}
NB: ho sostituito solo le parti più "ripetitive"....
PS: spero di non aver offeso nessuno con questa  "mia" riscrittura...

Scusate, ma riposto il codice corretto ( così imparo a non testare prima di 
postare )
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>
//dovrebbe bastare
#define DIMBUF 256
main()
{
clrscr();
int lung;
double a[DIMBUF],aa[DIMBUF];
for( int i = 0 ; i < DIMBUF ; i++ ) a[i]=0;
ifstream in("/etc/passwd");
ofstream out("out");
char parola[2000];
//Questo e' il punto importante
in>>parola;
lung=strlen(parola);
for (int ind=0;ind<lung;ind++)
        a[parola[ind]]++;
int lun=lung-a[' '];
out <<lun<<std::endl;
for( int i = 'a' ; i <= 'z' ; i++ ) 
        out<< a[i] <<' ';
out << a[' '] << endl;  
for( int i = 0 ; i <= DIMBUF ; i++ ) 
        aa[i]=a[i]/lun*100.;
for( int i = 'a' ; i <= 'z' ; i++ ) 
        out << (char)i << ": "<< aa[i] <<"%, ";
out << "spazio: "<< aa[' '] << "%" << std::endl;        
