Login Funktion

  • Themenstarter Themenstarter metti
  • Beginndatum Beginndatum
M

metti

Ich schreibe im Moment ein Programm in dem ich eine Art Login funktion benötige.
Ich habe ein Programm das Daten (also Benutzercode und Name) in eine Binädatei schreibt. Mit dem Login Programm soll dann die Binärdatei ausgewertet werden.
Der Benutzer gibt also den Benutzercode ein und das Programm sucht in der Binärdatei nach dem Benutzercode und wenn er vorhanden ist zeigt er den Namen an.
Das Hauptproblem ist, das ich es nicht schaffe mehrere Benutzer in die Binädatei zu schreiben und dann abzufragen.
Also ich schreibe zwei Benutzer rein, aber egal was ich mache, ich habe immer nur Zugriff auf den ersten.

Kann mir da jemand helfen?

Im voraus Danke.
 
Um dir hier helfen zu können musst du uns etwas mehr geben. Zeig mal den Code-Teil der die Benutzer in die Datei schreibt und wieder ließt.

Außerdem einfach binär reinschreiben ist nicht gerade der Bringer, das kann man einfach lesen mit einem Hexeditor oder äh.
Du solltest schon verschlüsseln, wenn es um Passwörter geht.

Gruß Homer
 
Quellcodes für lesen und schreiben

Hallo Homer,

Ich habe mal zwei Quellcodedateien hochgeladen. Musste Sie zippen. Das Archiv enthält schreiben.cpp und auslesen.cpp. Du wirst sehen, dass man mit diesem Quellcode nur user1 speichern und lesen kann. Das ist mein Problem. Wie setze ich statt user1 z.B. eine laufende Variable ein?

Passwörter müssen da nicht rein. Das soll nur ein Programm zur Erfassung von Benutzern und ihren Loginzeiten werden. Es sollen also keine geheimen Daten gespeichert werden.

Gruß
 

Anhänge

Furchtbar umständlich, mit dem Zip. Ich packe die Sourcen mal hierhin und sehe sie mir auch mal an.

schreiben.cpp
Code:
#include <iostream.h>
#include <stdio.h>
#include <string.h>

//Struktur Definieren
class Benutzer
{
int loginno;
char prename[20];
char name[20];
};

int main()
{	
	//Variablendeklaration
	Benutzer user1;
	
	cout << "Scannen Sie den Benutzercode, der hinzugefuegt werden soll."<<'\n';
	cin >> user1.loginno;
	cout << "Geben Sie den Vornamen des Benutzers ein."<<'\n';
	cin >> user1.prename;
	cout << "Geben Sie den Nachnamen des Benutzers ein."<<'\n';
	cin >> user1.name;

	//Datei C:\Eigene Dateien\Barcode\Binärdat\Binaerdat\benutzer.bin
	//zum Schreiben öffnen.
	FILE *Datei = fopen("C:\\benutzer.bin","a");

	//Werte in die Datei schreiben
	fwrite (&user1,sizeof(user1),1,Datei);

	//Datei schließen
	fclose(Datei);

	return 0;
}

auslesen.cpp
Code:
#include <iostream.h>
#include <stdio.h>
#include <string.h>

//Struktur Definieren
struct Benutzer
{
int loginno;
char prename[20];
char name[20];
};

int main()
{
	Benutzer user1;	
	
	FILE *Datei = fopen("C:\\benutzer.bin","r");

		//Strukturen lesen
		fread(&user1,sizeof(user1),1,Datei);

		cout << user1.prename<<'\n';
		cout << user1.name<<'\n';
		cout << user1.loginno<<'\n';

return 0;
}
 
Jaja, das ist ein Doppelpost, sorry, aber ich wollte Verwirrung mit den Sourcen vermeiden! ;)

Hier habe ich deine Sourcen gerade so weit modifiziert, dass 3 User gespeichert werden und beliebig viele gelesen. Hilft dir das weiter?

schreiben.cpp
Code:
#include <iostream.h>
#include <stdio.h>
#include <string.h>

//Struktur Definieren
class Benutzer
{
int loginno;
char prename[20];
char name[20];
};

int main()
{
	//Variablendeklaration
	Benutzer user1;

	//Datei C:\Eigene Dateien\Barcode\Binärdat\Binaerdat\benutzer.bin
	//zum Schreiben öffnen.
	FILE *Datei = fopen("C:\\benutzer.bin","a");


	for ( int i = 1; i <= 3; ++i )
	{
		cout << "Scannen Sie den Benutzercode, der hinzugefuegt werden soll."<<'\n';
		cin >> user1.loginno;
		cout << "Geben Sie den Vornamen des Benutzers ein."<<'\n';
		cin >> user1.prename;
		cout << "Geben Sie den Nachnamen des Benutzers ein."<<'\n';
		cin >> user1.name;
	        //Werte in die Datei schreiben
 	        fwrite (&user1,sizeof(user1),1,Datei);
        }

	//Datei schließen
	fclose(Datei);

	return 0;
}

auslesen.cpp
Code:
#include <iostream.h>
#include <stdio.h>
#include <string.h>

//Struktur Definieren
struct Benutzer
{
int loginno;
char prename[20];
char name[20];
};

int main()
{
	Benutzer user1;

	FILE *Datei = fopen("C:\\benutzer.bin","r");


	// Strukturen lesen
	// solange fread mindestens 1 Benutzer erfolgreich gelesen hat
	int i = 0;
	while ( fread(&user1,sizeof(user1),1,Datei) > 0 )
	{
		// ausgeben
		++i; // nur ein Zähler
		cout << "Benutzer " << i << '\n';
		cout << user1.prename<<'\n';
		cout << user1.name<<'\n';
		cout << user1.loginno<<'\n';
	}

	return 0;
}

Hinweis: Ich habe die Sourcen weder compiliert, noch getestet. Wenn du also Probleme hast mit Fehlern oder so, liegt es wahrscheinlich an mir. Ich werde das dann zubeheben versuchen.
 
schreiben.cpp

Ja. Das hilft mir weiter.
Die schreiben.cpp erzeugte allerdings einen Fehler.
Der Compiler meinte: Kein Zugriff auf private Element,dessen Deklaration in der Klasse "Benutzer" erfolgte.
Der Fehler kommt an allen 3 Stellen, an denen die Eingabe erfolgt.
Also user1.loginno, user1.prename, user1.name.
Ich habe den Fehler aber gefunden. Die Klasse Benutzer muss man public setzen.
Das nächste Problem ist jetzt nur, beim Login wird der Benutzercode abgefragt. D.h. die Daten in der Binärdatei müssen nach Benutzercode gespeichert werden. Im Moment wird die Datei ja nach Benutzer1, 2, 3. sortiert.
Der Benutzercode soll ein Barcode sein, d.h. es ist eine Zahlenkombination.
Das Programm soll ja beim Login mit dem Benutzercode auf die Binärdatei zugreifen. Ist der Benutzer vorhanden soll er die Benutzerdaten auslesen. Man müsste also aus dem Benutzer1,... irgendwie ein Benutzercode machen.
Das einfachste wäre doch, wenn ich den Benutzercode fortlaufend vom Programm festlegen lasse. Also wie du das gemacht hast nur statt Benutzer 1 z.b. Benutzer 32395. Und in der auslesen.cpp müsste das Programm dann bei Eingabe dieses Benutzers die Benutzerdaten in char- Variablen schreiben.
Geht das so?

Danke für die Hilfe
 
Der Compiler meinte: Kein Zugriff auf private Element,dessen Deklaration in der Klasse "Benutzer" erfolgte.
Ja, mir fällt gerade auf, dass du in schreiben.cpp aus Besitzer eine class gemacht hast und in auslesen.cpp ein struct. In einem struct sind alle Eigenschaften defaultmässig public, also von aussen sichtbar. Bei class ist das anders, da ist alles defaultmässig private , also vor dem direkten Zugriff von aussen geschützt.
Ich schlage vor, dass du in der schreiben.cpp ebenfalls struct benutzt, um das Problem zu lösen.

Das nächste Problem ist jetzt nur, beim Login wird der Benutzercode abgefragt. D.h. die Daten in der Binärdatei müssen nach Benutzercode gespeichert werden. Im Moment wird die Datei ja nach Benutzer1, 2, 3. sortiert.
Der Benutzercode soll ein Barcode sein, d.h. es ist eine Zahlenkombination.
Das Programm soll ja beim Login mit dem Benutzercode auf die Binärdatei zugreifen. Ist der Benutzer vorhanden soll er die Benutzerdaten auslesen. Man müsste also aus dem Benutzer1,... irgendwie ein Benutzercode machen.
Das einfachste wäre doch, wenn ich den Benutzercode fortlaufend vom Programm festlegen lasse. Also wie du das gemacht hast nur statt Benutzer 1 z.b. Benutzer 32395. Und in der auslesen.cpp müsste das Programm dann bei Eingabe dieses Benutzers die Benutzerdaten in char- Variablen schreiben.
Geht das so?
Mir ist noch nicht ganz klar, was du eigentlich vorhast , aber es hört sich irgendwie knifflig an. Um was für einen Login geht es, und was willst du eigentlich schützen - ich meine, in was für eine Art Anwendung baust du das ein?
 
Vorhaben

Also ich erkläre dir mal was ich vorhabe.
Der Vater eines Kumpel von mir besitzt eine Firma, die Platinen bestückt.
Jede Platine hat einen Barcode. In der Firma gibt es mehrere Räume mit ca. 6 Workstations. in jedem Raum befindet sich ein Rechner und 6 Barcodeleser an jeder Station. (Das ist schon ein Problem, 6 Barcodes an einen Rechner zu bekommen. Aber das ist im Moment nicht so wichtig).
Der Zweck des Progs soll sein:
Ein Benutzer setzt sich an eine Workstation. Scannt seinen Benutzercode. Das Programm prüft den Benutzercode und gibt seinen Namen heraus. Als nächstes scannt er die Platine. Dann scannt er die Aktion. Also z.B. bearbeiten oder überprüfen. Jede Aktion hat einen Barcode. Die Barcodes werden ausgehändigt.
Das Programm nimmt dann die Zeit. Der Benutzer fängt an zu arbeiten. Wenn er fertig ist scannt er einen beenden-Code. Das Programm nimmt die aktuelle Zeit zieht sie ab von der Anfangszeit ab. Damit ist die Dauer bestimmt(Da gibt es ein kleines Problem. Was ich bis jetzt programmiert habe gibt die Sekunden aus. Besser wäre Stunden und Minuten). Dann werden die Daten(Benutzer,Produkt, Aktion und Dauer) in eine Textdatei gespeichert. (Wenn das Programm ausgereift ist, soll es in eine Dbase Datenbank gespeichert werden. Das ist aber noch mal ein neues Problem). Die Variablen werden dann wieder Null gesetzt un ein anderer kann sich anmelden.
Das ist der Gedanke. Ziemlich kompliziert.
Ich habe bis jetzt programmiert:
Der Login mit switch und case.(Nachteil: Jeder Benutzer muss in dem Quellcode stehen, deswegen die Binärdatei)
Der Produktcode wird einfach in eine Integer geschrieben.
Die Aktionen sind denke ich immer gleich. Daher habe ich sie auch mit switch geschrieben. Man benötigt hier nicht zwingend ein extra Datei.
Dann die Zeit mit difftime (Problem: Ausgabe in Sekunden).
Und Logout mit schreiben in eine txt. Datei. (Ich habe Probleme beim Abspeichern der char prename und char name im txt Document. Er schreibt nur Zahlen statt Name und Nachnam)
Und was noch fehlt man müsste noch die Uhrzeit des Abspeicherns in die Datei bringen. Da ja mehrere Daten rein sollen, kann man dann die Daten besser auseinander halten.

Das ist die komplette Geschichte. Wie du schon sagtest: knifflig!
 
Zurück