Infatti ... la questione è in rosso
	codice:
	    cin  >> cognome;
      
    while (studenti >> nomeS >> cognomeS >> luogoNascitaS >> dataNascitaS >> classeS)
	{
		insegnanti.seekg(0, insegnanti.beg);
        while (insegnanti >> nomeI >> cognomeI >> luogoNascitaI >> dataNascitaI >> classeI >> materia)
        {
                if((cognome==cognomeS) && (classeS==classeI)){                          
                            cout << "\tNome: " << nomeI << "\tCognome: " << cognomeI << "\tMateria: " << materia <<endl;
                            i++; 
                            }
        }
 
In ogni caso, dato che cerchi un solo cognome che sta nel file registro, non dovresti scrivere due while una dentro l'altra ma una prima while per trovare i dati del nominativo cercato nel registro e poi un solo while dopo per cercare i dati nel file insegnanti, ovveo
	codice:
	    cout << "Inserire il cognome dello studente:" <<endl;
    cin  >> cognome;
      
    ifstream studenti;
    studenti.open("c:\\registro.txt");
     
    while (studenti >> nomeS >> cognomeS >> luogoNascitaS >> dataNascitaS >> classeS)
		if(cognome==cognomeS)
			break;
	ifstream insegnanti;
    insegnanti.open("c:\\insegnanti.txt");
    
	while (insegnanti >> nomeI >> cognomeI >> luogoNascitaI >> dataNascitaI >> classeI >> materia)
		if(classeS==classeI)
		{                          
			cout << "\tNome: " << nomeI << "\tCognome: " << cognomeI << "\tMateria: " << materia <<endl;
            i++; 
        }                                
	cout << "\n\n" << i << "insegnanti trovati per questo studente\n\n" << endl;