Ciao! Volevo chiedervi una piccola cosetta di C++.
Quando io apro un file in C++ devo giustamente collegarlo a uno stream. Poi volendo posso spostare il puntatore di lettura (per i file in input). Il file che ho fatto deve (o dovrebbe) contare il numero di caratteri del file in oggetto, stampare quindi uno dopo l'altro i caratteri del file e poi riposizionarsi all'inizio per ulteriori operazioni:
codice:
#include <iostream>
#include <fstream>
using namespace std;
int main (int argc , char* argv[]) {
char c;
int a=0;
ifstream in(argv[1] , ios::binary);
if (!in) {
cout << "Errore";
exit(1);
}
while (!in.eof()) {
in.get(c);
cout << c;
a++;
}
cout << endl << a;
in.seekg(0 , ios::beg);
/*
altre operazioni
*/
}
Il mio problema è il seguente: il numero di caratteri contato è sbagliato perchè in qualsiasi caso è sempre maggiore di uno rispetto al numero reale di caratteri del file e inoltre mi stampa inspiegabilmente per due volte l'ultimo carattere.
Questo comunque (anche se si puù risolvere aggiungendo codice) è strano...infatti dovrebbe controllare se il prossimo carattere sia o meno l'EOF e se non lo è stamparlo. Avreste qualche idea migliore da suggerirmi? grazie
Il problema maggiore ce l'ho dopo però. Se io voglio riportare la posizione di lettura all'inizio normalmente si usa la funzione seekg. Il problema è che se raggiungo nella lettura il carattere di EOF (come in questo caso) MISTERIOSAMENTE questa funzione SMETTE di funzionare e qualsiasi parametro gli dia, lascia sempre invariato il puntatore di lettura.
Questa cosa però ho visto che non mi capita nei casi in cui il puntatore non sia giunto alla fine del file, e in pratica se sto ancora "puntando" a dei caratteri regolari posso muovermi liberamente utilizzando la suddetta funzione, mentre se arrivo alla fine non posso più farlo. Un esempio è nel seguente pezzo di codice:
codice:
while (1) {
cin >> a;
in.seekg(a , ios::cur);
in.get(c);
cout << c;
in.seekg(-1 , ios::cur);
}
come potrete verificare, immettendo un quasiasi numero intero, verrà visualizzato il carattere del file dopo essersi spostati regolarmente del numero di posizioni immesse (sia in avanti che indietro) ma se immettete un numero tale da raggiungere la fine del file poi da li' non vi ci muovete più...provare per credere!
In teoria potrei aggirare il problema chiudendo e poi riaprendo il file, ma mi sembra una cosa sbagliata o, quantomeno sconsigliabile.
Come posso fare dunque per riportare all'inizio il puntatore di lettura anche nel caso io sia giunto alla fine del file?
grazie infinite a chiunque mi riesca ad aiutare!
Stefano