PDA

Visualizza versione completa : [C++] Problema getline [UPDATE]: problema array di char


wilhelm
11-04-2006, 20.28.28
Ciao a tutti,
ho un serio problema con getline.


Ho un programma in cui a un certo punto devo aprire un file e leggere da questo file degli oggetti di alcune classi.

scrivo:

string b;
getline(is, b, '|');

Il file corretto, ma alcune volte b rimane vuota. Magari, senza cambiare nulla, cerco di nuovo (nella stessa esecuzione del programma) di leggere il file e inspiegabilmente funziona...

Cosa posso fare?

Grazie a tutti,
Guglielmo :)

wilhelm
12-04-2006, 17.42.12
Pu essere che le librerie wx creano qualche problema con gli stream standard del C++?

Mi venuto in mente che forse potrei usare le funzioni TransferFileToStream e TranferStreamToFile.

Altrimenti veramente non so cosa fare...



Il problema questo: sto costruendo il mio progetto e, in tutta la gerarchia di classi c' la classe Biblio che implementa una biblioteca.

Questa classe ha ridefiniti gli operatori >> (istream come parametro) e << (ostream come parametro; poi nel corpo della ridefinizione dell'operatore distinguo ofstream da ostream generico).

Se faccio andare la classe Biblio con un main da riga di comando posso leggere e scrivere su file quante volte voglio e senza problemi.

Se lo faccio con un programma che usa le wx con cadenza random lo stesso file lo apre oppure si rifiuta perch, quando passa lo stream ifstream all'oggetto Biblio che la maschera usa c' qualche problema nel passaggio.
Forse le wx non sempre aprono bene un file?
Ho controllato e ricontrollato: tutte le funzioni che gestiscono file nella maschera (apri, chiudi, nuovo, salva) lasciano sempre i parametri corretti e richiudono sempre gli stream.


Non solo: a volte la cadenza di errore non random ma una volta funziona e l'altra no. E anche in salvataggio a volte devo salvare due volte perch alla prima non salva, quasi non aprisse il file. Forse proprio che non lo apre?

Grazie a tutti per l'aiuto,
Guglielmo

wilhelm
12-04-2006, 21.30.42
Allora: sono riuscito a capire che quando il programma arriva a:


ifstream fOpen(cf, std::ios::in);

oppure a:


ofstream fSave(cf, std::ios::trunc|std::ios::out);


se poi metto un:

cout << fOpen.fail() << " " << fOpen;

stampa: 1 0

Sto cercando di capire come mai non apre un file che esiste e lo stream in file senza compiere operazioni... :(

wilhelm
21-04-2006, 09.42.45
Trovato il problema ( :jump: ): avevo programmato male la funzione di conversione da string a char*.

In ogni caso era cos:


char* s2ch(string s) {
char* cf = new char[s.length()];
for (uint i = 0; i < s.length(); i++) {
cf[i] = s[i];
}
return cf;
}


Poi, dopo aver aperto il file aggiungevo delete cf e pensavo cancellasse l'array di char.

Invece se aprivo un nuovo file con un nome pi corto in coda all'array (seppur riallocato con new) trovavo gli ultimi caratteri del nome del file precedente...

Come mai?

Grazie a tutti,
Guglielmo