Estrazione testo da file

Riuzaki
con la seguente funzione intendo estrarre il testo contenuto nei file di una directory scelta da input e inserirlo in una serie di tabelle hash...

//funzione di acquisizione file...
void functionAdd()
{
	WIN32_FIND_DATA FindFileData;
	
	HANDLE hFind = INVALID_HANDLE_VALUE;
	
	char DirSpec[MAX_PATH]; // directory specification

	do
	{		
		cout << "Inserisci un Path valido:  ";
		cin >> DirSpec;
		strcat_s(DirSpec, "\\*");
		hFind = FindFirstFile(DirSpec, &FindFileData);
	}while(hFind == INVALID_HANDLE_VALUE);
		
	do
	{
		// If this filename is NOT a directory
		if( !(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
		{
			char dir2[MAX_PATH];
			for(int i = 0; i < MAX_PATH; i++)
			{
				dir2[i] = DirSpec[i];
				if(dir2[i] == '*')
					dir2[i] = '\\';
			}
					
			strcat_s(dir2, FindFileData.cFileName);
			ifstream is(dir2, ios::in);

			if (!is.good()) 
				cout << "Errore in apertura di: " << FindFileData.cFileName << endl; //controllo apertura file
				
			else
			{
				tabs t = leggiFile(is, FindFileData);
				if(t.getNel())
				  Files.push_back(t);
			}
			is.close();//chiudi il collegamento al file
		}//si sposta al file successivo all'interno della stessa directory
	} while( FindNextFile(hFind, &FindFileData) );
		  FindClose(hFind);//interrompe l'Handle al file...
}

tabs leggiFile(istream & is, WIN32_FIND_DATA FindFileData)
{
	tabs tab;
	tab.setNomeFile(FindFileData.cFileName);
	string s;
	int n = 0;//controlla se sono state inserite parole o meno...
	while(getline(is, s, '\n'))
	{//acquisisci fino alla fine della riga
		Tokenizer st(s);
		string token;
		while((token = st.next()) != "")tab.ins(token);
		s.clear();//svuota la stringa s
	}
	
	AddEffect++;//segna quante add sono state effettuate
	return tab;
}


il tutto funziona ad eccezione del push_back...
mi da un errore del tipo:
[img]http://img838.imageshack.us/i/catturazk.jpg/[/img] non so quale sia il motivo...fatto sta che se dichiaro static l'oggetto tab allora se la cartella contiene un solo file lo carica correttamente, ma se ci sono più file nella cartella mi si blocca con un'altra finestra di errore...
Files è di tipo vector> e tabs è un typedef di tabellahash

Risposte
Riuzaki
ok rimandiamo a domani, comunque grazie pe il tempo che stai perdendo con me ;)

Rggb1
Con le ultime modifiche fatte che tipo di errore ti segnala?

Riuzaki
si sempre lo stesso...ma forse ho capito dove sta il problema...non avevo implementato l'operatore di assegnamento per la classe tabellahash può essere un valido motivo per far scaturire quell'errore?

Rggb1
Non ho visibilità dell'intero codice... però direi non è un "valido" motivo.

In pratica se Win ti segnala access violation nell'accesso al path (funzione FindNextFile?), vuol dire che non trova più valido l'handle assegnato con FindFirstFile e/o la struttura dati che questo usa.

L'errore sul percorso potrebbe pure essere riferito al path dell'iostream(?), ovvero succedere all'interno della funzione leggiFile, che usa un nome recuperato dalla FindFirstFile/FindNextFile... senza il codice si dice male anche questa: una access violation può avere origine in un punto lontanissimo (in numero di righe di codice) a dove avviene ovvero si presenta sul debugger.

Riuzaki
ho capito che il problema è del costruttore di copia della tabella Hash...come posso realizzare il costruttore di copia se i dati membro sono questi:

	typedef list<T> lisEl;
		vector<lisEl> tab;
		int nEl;
		ChiaveHash<T> ch;
		string nomeFile;//mantiene il nome del file inserito nella tabella hash
		int occorrenze;

apatriarca
Come hai implementato il costruttore di copia? Ci possono essere problemi con la copia di una istanza di tipo ChiaveHash?

Riuzaki
no con chiaveHash no...il costruttore di copia ho pensato di farlo cosi:

TabellaHash(TabellaHash<T> & t)
		{
			for(unsigned int i = 0; i <= nCelle(); i++)
				for(list<T>::iterator it = t.tab[i].begin(); it != t.tab[i].end(); it++)
					tab[i].push_back(*it);
		}


ma mi da questi errori:

1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(1211) : error C2558: class 'TabellaHash<T>': nessun costruttore di copia disponibile o costruttore di copia dichiarato 'explicit'
1>        with
1>        [
1>            T=std::string
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(1153): durante la compilazione della classe modello, funzione membro 'void std::vector<_Ty>::_Insert_n(std::_Vector_const_iterator<_Ty,_Alloc>,unsigned int,const _Ty &)'
1>        with
1>        [
1>            _Ty=tabs,
1>            _Alloc=std::allocator<tabs>
1>        ]
1>        .\main.cpp(23): vedere il riferimento all'istanza del modello di classe 'std::vector<_Ty>' in corso di compilazione
1>        with
1>        [
1>            _Ty=tabs
1>        ]
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(1235) : error C2558: class 'TabellaHash<T>': nessun costruttore di copia disponibile o costruttore di copia dichiarato 'explicit'
1>        with
1>        [
1>            T=std::string
1>        ]

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.