Newsgroup: it.comp.lang.c++
Titolo: spazi vuoti in seguito al apri file....(importante)

ciao ancora,
ho un secondo problema abbastanza importante:
...prima di uscire dal mio programma, salvo tutto in un file ascii, salvo
ogni stringa usando il "setw" che gli dice quanto spazio adoperare nel file
per quel valore ///salva<<setw (60)<< passo->oggetto;///.
...quando rientro nel programma e apro il file che prima avevo salvato,  uso
il normalissimo get   ///apri.get (oggetto, 61);/// in questo modo, però, se
la stringa era "pagamento pippo", mi prende pagamento pippo, ma anche gli
spazi rimanenti fino ad arrivare a 61 totali; in questo modo, se,
nell'utilizzo del programma devo cercare "pagamento pippo" non me lo trova
più perchè in realtà la stringa è: "pagamento pippo____(e tutti gli
spazi)_____".
...come posso fare per dirgli che ad ogni stringa importata mi cancelli
tutti gli spazi?
...io avevo pensato ad un ciclo che partisse da in fonde e fino a che
trovava il valore asci dello spazio mi sostituisse ad esso il vlore "\n", ma
sinceramente nn saprei proprio come fare!
...vi prego aiutatemi! (:
(sotto vi ho messo il listato del salva e dell'apri!)
//salva file
void PROTOCOLLO::sfile()
{
 SCHEDA *passo = testa;
 fstream salva;
 salva.open("elisa.txt", ios::out);
 while (passo!=NULL)
 {
 salva<<setiosflags(ios::left);
 salva<<setw (5)<<passo->nprotocollo;
 salva<<setw (15)<< passo->ncommessa;
 salva<<setw (60)<< passo->mittente;
 salva<<setw (60)<< passo->destinatario;
 salva<<setw (60)<< passo->oggetto;
 salva<<setw (60)<< passo->documento;
 salva<<setw (1)<< passo->entraesce;
 salva<<setw (2)<< passo->giorno;
 salva<<setw (2)<< passo->mese;
 salva<<setw (4)<< passo->anno;
 salva<<setw (10)<< passo->data;
 salva<<"\n";
 salva<<resetiosflags(ios::showbase);
 passo = passo->prossimo;
}
 salva.close();
}
//**************************************************************************
******************
//apertura file
int PROTOCOLLO::afile()
{
 int ultimonprotocollo;
 char ch;
 char nprotocollo[6];
 char giorno[3];
 char mese[3];
 char anno[5];
 char data[11];
 char ncommessa[16];
 char mittente[61];
 char destinatario[61];
 char oggetto[61];
 char documento[61];
 char entraesce[2];
 fstream apri;
 apri.open("elisa.txt", ios::nocreate | ios::in);
 if (!apri)
 {
  printf ("\t    ..:: ARCHIVIO NON ESISTENTE ::..  \n\n");
 }
 else
 {
 apri.get (nprotocollo,6);
 while(!apri.eof())
 {
    apri.get (ncommessa, 16);
    apri.get (mittente, 61);
    apri.get (destinatario, 61);
    apri.get (oggetto, 61);
    apri.get (documento, 61);
    apri.get (entraesce, 2);
 apri.get (giorno, 3);
 apri.get (mese, 3);
 apri.get (anno, 5);
 apri.get (data, 11);
 apri.get(ch);
 while (ch != '\n') apri.get(ch);
    SCHEDA *temp=new SCHEDA;
    temp->nprotocollo=atoi(nprotocollo);
 strcpy(temp->ncommessa,ncommessa);
 strcpy(temp->mittente,mittente);
 strcpy(temp->destinatario,destinatario);
 strcpy(temp->oggetto,oggetto);
 strcpy(temp->documento,documento);
 strcpy(temp->entraesce,entraesce);
 temp->giorno=atoi(giorno);
 temp->mese=atoi(mese);
 temp->anno=atoi(anno);
 temp->data=atol(data);
 temp->prossimo=NULL;
 if (testa==NULL)
   {
    testa=temp;
   }
   if (coda!=NULL)
   {
    coda->prossimo=temp;
   }
   coda=temp;
    apri.get (nprotocollo,6);
 ultimonprotocollo=1+(temp->nprotocollo);
}}
 apri.close();
 return(ultimonprotocollo);
}

per quel valore ///salva<<setw (60)<< passo->oggetto;///.
Ho dato solo un'occhiata veloce al codice quindi potrei dire cavolate.
Prima di tutto potresti usare std::string per gestire le stringhe
invece dei char e std::list per getire la lista.
Poi leggi con getline una riga per volta dal file, fai dei controlli
sulla lunghezza (il file potrebbe essere in formato sbagliato) e poi
la dividi con substr nei componenti. Gli spazi possono essere
eliminati molto facilmente ma se ne č parlato piů volte sul newsgroup
e quindi avresti potuto fare una ricerca con Google, comunque per
verificare che fosse davvero cosě semplice trovare la soluzione ho
provato a cercare e ho trovato come primo messaggio uno di Maurizio
Loreti da cui ho preso questa funzione trim:
string trim(const string & in) {
  // Definizione di "whitespace" sotto POSIX
  static const char spaces[] = " \t\n\r\f\t\v";
  string::size_type start = in.find_first_not_of(spaces);
  // Tutti spazi ?
  if (start == string::npos) return "";
  string::size_type length = in.find_last_not_of(spaces) - start + 1;
  return string(in, start, length);
} 
-- 
Marco Barisione (ICQ 84277092)

scusami ma non č che ci abbia capito un gran che....
cmq, mi sono fatto un giro su google e alla fine mi č venuta l'ispirazione!!
..era molto piů semplice di quanto credevo!!!
...nn so se sia c++ puro o se č un misto tra c e c++ o cos'altro, ma cmq
funziona!
se serve a qualcuno:
for (int n=strlen(ncommessa); n=0; n--)
 {
  if (ncommessa[n]= 32)
  {
   ncommessa[n]=0;
  }
 }
ciao e grazie comunque!
Francesco

   ncommessa[n]=0;
Invece di 0 metti '\0'.


cosa cambia?


cosa cambia?
Che non č detto che lo spazio sia 32 su tutti i sistemi e poi č piů
leggibile.


 leggibile.
Orrore!  E _nessuno_ si e' accorto di = al posto di == ?  Aaaarrghhh!
-- 
Maurizio Loreti  - Linux Is Not UniX -  
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

Orrore!  E _nessuno_ si e' accorto di = al posto di == ?  Aaaarrghhh!
Veramente no :-( è il più tipico errore di distrazione che faccio
(dopo dimenticare il ";"), forse perché ho iniziato in VB (altro
orrore...) in cui non  si usa ==.
Comunque non capisco il perché usare sempre i char* quando ci sono le
std::string tanto comode, in particolare trovo l'esempio che ho
postato (che è tuo) molto più chiaro anche per un newbie che conosce
poco le std::string, magari l'unico problema può essere
string::size_type.
