Newsgroup: it.comp.lang.c++
Titolo: lettura file riga per riga su linux

Salve a tutti.
Come progetto d'esame devo creare un'agenda elettronica, dando la 
possibilità di salvare e rileggere da file gli eventi inseriti dall'utente.
il file è salvato sottoforma di testo con una sintassi un po 
particolare(piu che altro per semplicità mia), e la lettura e quindi la 
ricostruzione della lista degli eventi va sempre a buon fine.
Noto solo un problema: se tento di leggere (con getline) il file creato 
con win su linux, quest'ultimo non riconosce gli acapi, considerando di 
fatto il file come un unica stringa, cosa che non accade se tento di 
leggere da win il file creato con linux.
qualche spiegazione?
Grazie.
B.


Linux e Win utilizzano un formato diverso per memorizzare "\n" nei file 
di testo. Però il comportamento che riporti non lo capisco. Se leggi un 
file win da Linux dovresti solamente ritrovarti il carattere 13 alla 
fine di ogni riga. Puoi riportare la stringa che ottieni dal file?
E.

 fine di ogni riga. Puoi riportare la stringa che ottieni dal file?
dunque: mi scuso per prima ma il comportamento che avev descritto non è 
esattamente quello che capita...
dunque: i record nel file sono salvati in questa maniera:
[impegno]
[ora]
12:12:12
[descrizione]
ciauciau
[luogo]
casa mia
[data]
12/10/2008
[fine impegno]
il ciclo di lettura è:
while(!database.eof()){
   getline(database,buffer);
   cout <<"--"<<buffer<<"--"<<endl; //messo per vedere cosa legge
   ..
   ... altre operazioni
   ...
}
con win ho questo output:
--[impegno]--
--[ora]--
ecc..
con linux questo:
--[impegno]
--[ora]
(si, senza -- alla fine)
ma rimane sempre il fatto che se leggo con win il file generato con 
linux questa cosa non accade.
ciao

 --[ora]
E' proprio quello che ti dicevo. Il carattere 13 a fine riga causa un 
Carriage Return che sul terminale significa che vai alla colonna 0 
quindi il "--" mancante è in realtà sovrascritto al "--" all'inizio riga 
(prova a mettere dei caratteri diversi per conferma).
E.


In questi casi la cosa migliore da fare è togliere tutti i caratteri 
blank a fine stringa:
void removeTrailingBlank(char *s) {
	char *p=s;
	for (;*p;p++);
	for (p--;p>=s && isspace(*p);p--)
	  *p=0;
}
E.

 (prova a mettere dei caratteri diversi per conferma).
mmh...hai ragione.. anche perchè se controllola lunghezza della stringa 
è sempre piu lunga di un carattere, che a sto punto è quel carattere 13 li..
una possibile soluzione?

 }
ok grazie mille!
ora non ho tempo, ma stasera appena torno ti faccio sapere.
ciao.

ho provato la soluzione che mi hai scritto, ma non funziona 
semplicemente perchè tu alla funzione hai dato come parametro una 
stringa "stile c"
invece io ho una stringa "stile c++", quindi per eliminare quel 
carattere ho fatto cosi:
string toglireturn(string str){
      if (str.size()>0)
        if (
str.at
(str.size()-1)==13){
          int dim=str.size()-1;
          str=str.substr(0,dim);
        }
      }
      return str;
}
cosi se c'è lo elimina, se non c'è semplicemente ritorna la stringa tale 
quale.
ciao

 }
Forse puoi anche fare:
void togliReturn(string &str) {
	size_t len=str.size();
	if (len && 
str.at
(len-1)==13)
		str.resize(len-1);
}
E.