Newsgroup: it.comp.lang.c++
Titolo: DOMANDE BANALI

Ciao, è da un po' che non ho quesiti da porvi su questo newsgroup...
ma ora ho dei problemi (mi sembrano molto banali) ma non riesco
assolutamente a risolverli... mi aiutate ?
grazie
allora... 
1) Io ho un programma che legge un carattere alla volta da un file e
legge linee di 100 caratteri. Una volta arrivato a 100 caratteri come
faccio a mandare a capo per poter proseguire con la lettura ? Ci và da
solo ? Boh... (nb: il file è aperto in modalità sola lettura) 
2) questa è un po' meno banale , ma sembre banale...
eccovi illustrato il mio problema (semplificato)
f.open("file1.tmp", ios::app)
char carattere;
int lettura;
switch (lettura)
{
case 1:
carattere = 'a';
break;
case 2:
carattere = 'b';
break;
\\ continua per molte altre volte
default:
carattere = ' ';
};
f.write(carattere, 1);
f.close();
Bene ... il problema è che il mio compilatore mi dà il seguente
messaggio di errore (e si riferisce alla parte del listato in cui devo
scrivere su file la variabile carattere)
eccovi il messaggio completo:
error C2664: 'class ostream &__thiscall ostream::write(const char
*,int)' : cannot convert parameter 1 from 'char' to 'const char *'
        Conversion from integral type to pointer type requires
reinterpret_cast, C-style cast or function-style cast
Ovviamente la variabile lettura proviene da un'altra parte di
programma... e le scelte dello switch sono molte di più... cmq la
sostanza del codice è quella che vi ho semplificato. Perchè il mio
compilatore mi dà questo messaggio?? ho provato molte alternative
..ma .... nulla... dov'è il mio problema ???
bene, per oggi basta... ma vi dovrò porre altri quesiti ^__^
saluti a tutti e millegrazie per la vostra disponibilità !!
<--------------------------------------------------->
messaggio by: credici
mailtome    : 
cre...@infinito.it
my home     : 
http://credici.supereva.it
 
visitate subito : 
http://www.city3000.it/athenet
e non ve ne pentirete mai 
<--------------------------------------------------->

 saluti a tutti e millegrazie per la vostra disponibilità !!
Manlio Perillo

grazie per la risposta ... proverò..
ma come faccio ad usare getline per l'input ?
Io  lo sò usare solo per leggere da file.. non per scrivere
e poi mi serve un carattere alla volta..


 solo ? Boh... (nb: il file è aperto in modalità sola lettura)
e ad essere sinceri non mi è ben chiaro cosa vuoi fare esattamente.
Manlio Perillo

e ad essere sinceri non mi è ben chiaro cosa vuoi fare esattamente.
Ti rispiego :
Io apro un file in modalità sola lettura e da lì leggo un carattere
alla volta per interpretarlo. Io ho impostato che dopo aver letto 100
caratteri finisce la linea e cioò implica che dopo il 100° carattere
il programma dovrebbe andare a capo per poter leggere nuovi 100
caratteri da una nuova linea fino a che non finisce il file. Il mio
problema è trovare un metodo di  mandare a capo il programma di
lettura senza saltare linee. Non mi sono venute idee... ma più che
idee non sono sicuro di fare giusto e il programma non posso provarlo
(lo voglio provare su un computer vecchio che ho in un'altra città e
ci andrò fra molto tempo) cosicchè da voler fare le cose per bene. Ora
hai inteso qual'era il mio problema? Mi sai dare un suggerimento per
risolverlo ?
Grazie


 Grazie
Se il file è composto da linee basta usare getline.
Il prototipo è:
istream& getline(char* s, streamsize n, char delim = '\n');
Questa funzione legge al massimo n - 1 caratteri in
s[0] .. s[n - 2].
Se viene incontrato il carattere delim la lettura termina.
delim non è inserito in s(che invece viene terminato
con '\0') e viene rimosso da istream(a differenza di get).
Quindi nel tuo caso:
char buf[100];
f.getline(buf, 100);
Se il file è una sequenza di caratteri, per leggere 100
caratteri alla volta basta fare:
char buf[100];
f.read(buf, 100);
(buf non termina con '\0' ma contiene esttamente i 100 caratteri
 letti).
Per analizzare i caratteri basta analizzare buf.
Ovviamente in questo caso non ha senso parlare di linee.
Un 'problema' di read è che non restituisce direttamente
il numero di caratteri effettivamente letto.
Tuttavia questo valore si può ottenete chiamando gcount().
Se non possono venir letti tutti i 100 caratteri, istream
va in fail.
Quindi per leggere tutto un file:
char buf[100];
while(f.read(buf, 100))
{
    // usa i 100 caratteri in buf
    // ...
}
if(f.gcount() > 0)
{
    // ci sono dei caratteri da analizzare in buf
    // ...
}
Una soluzione alternativa è usare direttamente streambuf:
char buf[100];
streamsize readed = f.rdbuf()->sgetn(buf, 100);
Quindi per leggere tutto il file:
streamsize readed;
char buf[100];
while( (readed = f.rdbuf()->sgetn(buf, 100)) > 0 )
{
    // analizza i readed caratteri in buf
    // ...
}
Spero di esserti stato di aiuto.
Manlio Perillo

il mio è un file testo... ma se la linea termina con "\n" presuppongo
che quando il programma legge il carattere e vede che è uguale a \n
allora torna a capo automaticamente.... giusto?



Il fatto di tornare a capo non ha molto senso.
Un file di testo come:
Hello
word
è composto dai caratteri:
[H][e][l][l][o][\n][w][o][r][d]
Il fatto di tornare a capo esiste solo nei visualizzatori
di testo in cui al carattere '\n' corrisponde mandare il
cursore a capo.
Manlio Perillo

allora torna a capo automaticamente.... giusto?
No, questo succederà quando visualizzerai con un editor il file di
testo che hai creato.
Il Ghenio
-----------
LOVELY SARA
Dal lunedi'al venerdi'su Italia Uno alle 8:10
Non perdetevelo...
-----------

ok, ora è tutto chiaro... ^__^
