Estrazione testo da file
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...
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
//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
Risposte
ok rimandiamo a domani, comunque grazie pe il tempo che stai perdendo con me

Con le ultime modifiche fatte che tipo di errore ti segnala?
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?
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.
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.
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;
Come hai implementato il costruttore di copia? Ci possono essere problemi con la copia di una istanza di tipo ChiaveHash?
no con chiaveHash no...il costruttore di copia ho pensato di farlo cosi:
ma mi da questi errori:
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> ]