[c++/qt4]Auslesen und vergleichen<->Loginsystem

kickerxy123

Erfahrenes Mitglied
Hallo, ich bins mal wieder ;)
Also:
Ich verwende XP Home, SP2
Eclipse
QT4.0.0.1

mein Problem:
der user soll sich einloggen, seine eingegebenen Daten werden mit denen aus einer datei verglichen, falls eine Übereinstimmung erfolgt ist, wird ein neues Fenster geöffnet.

//etwas verkürtzt und auf das wesentliche beschränkt:

Code:
//Alles richttig included, daran liegt es nicht!
//...
void scc::on_login_clicked(){            //Login-Button

	ui.error->setText("");
	login_user = ui.name ->text();
	if(krux_pw!="///"){ //wenn eine "Sternchen-"Eingabe erfolgt ist
	login_pw   = krux_pw;//nimmt er das unverschlüsselte PW
	}
	else{					//sonst DIREKT vom Eingabefeld
		login_pw = ui.pw ->text();
	}

	unsigned short max = 256;

	string name[max];
	string pass[max];
	
	ban=0;
	
                ifstream akt_abfrage("C:/system.dll");
	for(unsigned short u=0;u<max;u++){
		getline(akt_abfrage,name[u],'\n');
		if(name[u]==""){	//Falls Leerzeile, dann folgen die PWs
			for(unsigned short z=0;z<max;z++){
				getline(akt_abfrage,pass[z],'\n');
			}
		}
	}//Konvertierung von QString nach String:

	QByteArray ba = login_user.toLatin1(); 
	const char *user = ba.data(); 
	QByteArray bat = login_pw.toLatin1(); 
	const char *pw = bat.data();


for(unsigned short i=0;i<max;i++){
	if(user==name[i]){
		if(pw==pass[i]){
			if(ban<100){ 
			    if(user!=""){
//user ist angeblich immer !="",warum auch immer?!          
			//Access Allowed!
	//Aufruf einer neuen Klasse
		ofstream m("C:/cur_user.dll",ios::trunc);
		m << user;
		
		if(ui.login_checkbox->isChecked()){
			m << '\n' << pw;
			
		}
		if(ui.autom->isChecked()){
			m << '\n' << "true";
		}
		m.close();

		
		Zed zed;
	zed.exec();
//Wie kann ich an dieser Stelle das aktuelle Fenster schließen oder hiden
				}
			}	
		}else{
			ui.error->setText("Name und / oder Passwort falsch");
			versuche++;
			if(versuche>3){
				ban=5000;
			}        //5Minuten gebannt.
		}
	}
}};

Bitte nicht auf Syntax o.ä. achten, wie gesagt, ist gekürtzt(kann sein, dass ne klammer fehlt)
beim kompilieren (Mingw) gibt es keine Fehler oder Warnungen.
Bis gestern gings auch noch, ich weiß nicht was ich hier so verändert habe, dass es nicht mehr geht :( (er öffnet nicht mehr "zed" und trägt auch kein cur_user ein).

Ich hoffe ihr könnt mir helfen :(


#edit: Ausgangsdateien:

cur_user.dll: Leer oder wird gelöscht (ios::trunc)
system.dll:
Code:
Peter
Hans
Karl

8512
kl11c
fw34
 
Zuletzt bearbeitet:
Einmal aufgeärumt:
C++:
typedef std::pair<std::string, std::string> user_t;

// Login-Button :: OnClick-Event
void scc::on_login_clicked()
{
    // Reset error field
    ui.error->setText("");

    // get login data
    login_user = ui.name->text();
    login_pw = (krux_pw != "///" ? krux_pw : ui.pw ->text());
    
    std::vector<user_t> registered_users;
    
    std::ifstream file_stream("C:\\system.dll");
    std::string line;
    while (std::getline(file_stream, line) && line != "") registered_users.push_back(std::make_pair(line, ""));
    
    std::vector<user_t>::iterator it(registered_users.begin());
    std::size_t size(0);
    while (std::getline(file_stream, line) && it != registered_users.end()) { it->second = line; ++it; }


    const QByteArray ba_user(login_user.toLatin1()); 
    const char* ptr_user(ba_user.data()); 
    const QByteArray ba_password(login_pw.toLatin1()); 
    const char* ptr_password(ba_password.data());


    unsigned char tries(0);
    for (std::vector<user_t>::const_iterator it (registered_users.begin()); it != registered_users.end() && tries < 3; ++it)
    {
        if (it->first == ptr_user)
        {
            if (it->second == ptr_password)
            {
                std::ofstream file_stream_save("C:\\cur_user.dll", std::ios_base::trunc);
                file_stream_save << ptr_user;

                if(ui.login_checkbox->isChecked()) file_stream_save << '\n' << ptr_password;
                if(ui.autom->isChecked()) file_stream_save << '\n' << "true";

                Zed zed;
                zed.exec();
            }
            else
            {
                ++tries;
                ui.error->setText("Name und / oder Passwort falsch");
            }
        }

    }
}
 
Danke erstmal ;)
Ich habe mein Fehler gefunden, lag an einer Endlosschleife in der Zed Class.

Aber jetzt hab ich noch ein neues Problem ;)
Hab auch schon Ansätze..

Ich will einer Textbox sagen, dass sie sich alle X Sekunden refreshed...
leider weiß ich nicht wirklich wie ich da ran gehen soll..
hab an Ansätze wie mit html gedacht (<meta http-equiv="Refresh" content="X"> mit (X/60)=Sekunden)
oder
txt.DataBindings.Add("Text", bsDataSource, "Feldname", False, DataSourceUpdateMode.OnPropertyChanged) ?

Also die Daten liest er von der q_c.dll aus... Und das refreshen würd ich ja auch noch hinkriegen, aber das müsste ja PARALLEL zu eventuellen Usereingabe laufen können :(
Unparallel würds mit diesem Ansatz gehen:
Code:
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
//...
unsigned short size=10000;
string ein[size];

ifstream einlesen("C:/q_c.dll");
for(short i=0;i<size;i++){
getline(einlesen,ein[i],'\n');
}
//Auslesen der Datei
while(1==1){    //kA welche Bedingung, optimal wäre soetwas wie: if(<datei.size>ist 
                      // verändert){...} 
ui.ausgabe ->clear
for(short z=0;z<size;z++){
ui.ausgabe ->setText(ein[z]+'\n');
}//Ausgabe in der Textbox
Sleep(<Wartezeit in Msek>);
}

void Zed::on_send_btn_clicked(void){

//Sendevorgang; der User muss Parallel zu dem Obrigen reagieren können


};
Oder wäre es mit Windows Message Hanslern einfacher? Leider kenne ich mich da ncoh weniger aus :( bin über jeden Ratschlag dankbar!
mfg
kickerxy
 
Zuletzt bearbeitet:
Hallo,

ich denke ein QTImer eignet sich hervorragend dafür. Schau mal hier:

C++:
#include <QApplication>
#include <QWidget>
#include <QMainWindow>
#include <QLineEdit>
#include <QLayout>
#include <QTimer>
#include <QTime>

class QTimerExampleWidget : public QWidget {

    Q_OBJECT

    private:
	QLineEdit *qle;
	QBoxLayout *qbl;
	QTimer *qt;

    public:
	QTimerExampleWidget(QWidget *parent = 0) : QWidget(parent) {
	    qle = new QLineEdit();
	    qle->setReadOnly(true);
	    qle->setText(QTime::currentTime().toString("hh:mm:ss"));
	    
	    qbl = new QBoxLayout(QBoxLayout::TopToBottom);
	    qbl->addWidget(qle);
	    setLayout(qbl);
	    
	    qt = new QTimer;
	    QObject::connect(qt, SIGNAL(timeout()), this, SLOT(timeoutSlot()));
	    qt->start(1000);
	}

	~QTimerExampleWidget() {
	    delete qt;
	}

    private slots:
	void timeoutSlot() {
	    qle->setText(QTime::currentTime().toString("hh:mm:ss"));
	}
};

int main(int argc, char **argv) {
    QApplication appl(argc, argv);
    QMainWindow mw;

    mw.setCentralWidget(new QTimerExampleWidget());
    mw.show();

    return appl.exec();
}

#error "Include your moc-file at this point. Syntax is #include <file.moc>"

Gruß,
RedWing
 
wow, danke :) Hat ein bischen gedauert bis ich das verstanden habe ;) (und hab im moment wenig Zeit...) QTimer war eine gute Idee, klappt bestens, Danke ;-)
 
Zurück