[CPP]problema (forse banale) con reference e ifstream

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
DavideDaSerra
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: domenica 15 febbraio 2009, 15:26
Desktop: xubuntu
Distribuzione: Ubuntu12.10 x86_64
Località: Da qualche parte in quel di Modena

[CPP]problema (forse banale) con reference e ifstream

Messaggio da DavideDaSerra »

Ciao, volevo chiedere perché in CPP se passo a una funzione ricorsiva una reference a un ifstream, il passaggio 'verso il basso' avviene normalmente, ma se la funzione 'chiamante' prova a ri-usare quell' ifstream lo trova col bad-bit settato.

Codice: Seleziona tutto

using namespace std;
int parse(std::ifstream &in, string &output){

	
	char buff[100], ch;
	while (true){
		for (size_t t = 0; t < 100; ++t)buff[t] = '\0';
		if (in.peek() == 'd'){
			in.get();
			cout << "trovato dictionary\n";
			//cout << "{ ";
			while (in.peek() != 'e'){


				string key;
				parse(in, key);

				if (in.good()){ cout << "good\n"; }
				else { cout << "bad\n";  return ""; }

				string value;
				parse(in, value);
				cout << '"' << key << "' =>" << value << '\n';
			}

			cout << " } fine dict\n";
		}
		else if (in.peek() == 'l'){
			cout << "trovata lista\n ";
			ch = in.get(); //rimuovo la 'l'
			parse(in, output); //mi richiamo
			in.get(); //rimuovo la 'i';

		}
		else if (in.peek() == 'i'){
			ch = in.get();

			in.getline(buff, 100, 'e');

			long long val = atoll(buff);
			cout << "trovato numero" << val << '\n';
			output = string(buff);
		}
		else if (isdigit(in.peek()))

		{
			in.getline(buff, 100, ':');
			long long len = atoll(buff) + 1;

			cout << "LEN: " << len << '\n';

			char *s = (char*)malloc(len*sizeof(char));
			for (size_t t = 0; t < len; ++t)s[t] = '\0';
			in.getline(s, len);
			//cout << "trovata stringa: "<< s<<'\n';
			output = string(s);

		}
		

		return "0";
	}



}
questo codice dovrebbe servire per parsare dati in formato bencode.

descrizione del bencode:
<lunghezza_stringa>:<sequenza di lettere> per le stringhe ES: 4:ciao per la stringa "ciao"
i<numero>e la codifica dei numeri ES: i123e per il numero 123
d<stringa><oggetto bencode><stringa><oggetto bencode>...e per i dizionari ES: d4:ciaoi23e5:Luciai22ee {(ciao,23),(Lucia,22)}
l<oggetto bencode><oggetto bencode>...e per le liste li22e6:pranzoe per [22, pranzo]
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 27 ospiti