String will nicht korrekt ausgelesen werden...

Moin,

na sag ich doch, es wird genau das ausgegeben, was in der Datei steht !!!
Sprich: Du liest 32 Zeichen ein und gibst diese 32 Zeichen wieder aus !!!

Ergo: wenn Du das nicht willst, dann darfst Du auch nur die gewünschten Zeichen ausgeben, in dem Du bspw. den eingelesen String entsprechend kürzt!
Von selbst geht das mit Sicherheit nicht!

Warum wird denn über ghaupt dieser ganze Text gespeichert und nicht nur der eigentlich Username rsp. das Passwort ??

Gruß
Klaus
 
Hallo

Ich vermute, dass da ein Missverständnis besteht. C/C++ ist eine relativ statische Sprache. Du kannst nicht Code aus einer Datei direkt übernehmen.
Daher: Wenn du eine Datei auslesen willst, mache es besser so:
C++:
FILE* f = fopen("user.files", "rb"); //Wenn's sein muss auch einfach nur "r"
if(f == NULL)
{
    perror("Datei konnte nicht geöffnet werden");
    return -1;
}
else
{
    char temp[128];
    char username[32];
    char password[32];
    while(fgets(temp, 128, f))
    {
        sscanf(temp, "%[^=]=%s;", username, password);
        printf("User %s hat Passwort %s\n", username, password);
    }
    fclose(f);
}

Das Dateiformat sieht dann so aus:
Code:
[username]=[password];[Kommentar]
Wobei Kommentar fakultativ ist.
Also als konkretes Beispiel:
Code:
MMustermann=123456; Ganz schlaues Passwort

Gruss
cwriter

//EDIT: Etwas OT, aber gewöhne dir besser nicht an, Passwörter im Klartext zu speichern. Das hier wird wohl nur eine Übung sein, aber sobald ein Programm den geschützten Bereich rund um Schule, Studium und Selbststudium verlässt, ist das fahrlässig.
 
Zuletzt bearbeitet:
@cwriter
Danke, das hat wirklich geholfen :)

Jetzt hab ich aber wegen dem sscanf eine Frage: Ich möchte das ja irgendwann verbreiten (Weil ich halt auf n Spiel hinarbeite^^) und da gibts ja nicht jedermann überall was ein. Wie kann ich also machen, dass der eine variable Anzahl von Strings speichert?

Und wegen dem Passwort: Da denke ich mir später was aus^^

EDIT:
C++:
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
  char nutzername[32];
  char pweingabe1[16];
  char pweingabe2[16];
  char pw[16];
  char ufabfrage = 0;
  char moeglichezeichen [62] = "0123465798abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  
  FILE *user;

  user = fopen("user.files", "rw");
  
  if(user == NULL) {
  printf("Es wurden keine Nutzerdaten gefunden.\nSollen jetzt Nutzerdaten angelegt werden? [Y/N]\n");
  scanf("%c", &ufabfrage);
  if(ufabfrage != 'y' && ufabfrage != 'Y') {
  system("cls");
  printf("Es werden keine neuen Nutzerdaten angelegt.\n");
  system("PAUSE");
  return 0;
  } else {
  system("cls");
  printf("Es werden neue Nutzerdaten angelegt.\n\nBitte geben Sie Ihren Nutzernamen (Max. 32 Zeichen, Zahlen von 0-9, Zeichen von a-z bzw. A-Z): ");
  scanf("%s", &nutzername);
  
  int len = strspn(nutzername, moeglichezeichen);
  
  if(len > 32) {
  printf("Nutzername enthält mehr als 32 Zeichen.\nBitte starte das Programm neu um dich erneut anzumelden.\n");
  Beep(3000, 100);
  sleep(3);
  Beep(3000, 100);
  system("PAUSE");
  return 0;
  }
  
  printf("\nBitte geben Sie Ihr Passwort ein: ");
  scanf("%s", &pweingabe1);
  printf("\nWiederholen Sie Ihr Passwort: ");
  scanf("%s", &pweingabe2);
  
  int len1 = strspn(pweingabe1, moeglichezeichen);
  
  if(strcmp(pweingabe1, pweingabe2) != 0 || len1 > 32) {
  printf("Die Passwörter stimmen nicht überein oder das eingegebene Passwort ist zu lang.\n");
  Beep(3000, 100);
  sleep(3);
  Beep(3000, 100);
  system("PAUSE");
  return 0;
  } else {
  system("cls");
  printf("Nutzerdaten wurden erfolgreich angelegt!\n\nNutzername: %s\nPasswort: %s\n\n", nutzername, pweingabe2);
  user = fopen("user.files", "a");
  fprintf(user, "%s=%s", nutzername, pweingabe2);
  fclose(user);
  system("PAUSE");
  }
  }
  } else {
  char temp[128];
  while(fgets(temp, 128, user))
  {
  sscanf(temp, "%[^=]=%s;", nutzername, pweingabe2);
  printf("Angemeldet als: %s\nPasswort: %s\n", nutzername, pweingabe2);
  }
  system("PAUSE");
  fclose(user);
  }
}

EDIT of the EDIT:
Ich habe keine Ahnung warum der das jetzt so jetzt unübersichtlich formatiert :/
 
Zuletzt bearbeitet:
Hallo

Eine variable Anzahl Strings? Wie darf ich das verstehen? Grundsätzlich bieten sich da mehrere Möglichkeiten an: strtok() und strchr(), aber auch einfach zeilenweise Speichern liegt alles drin.
Was willst du denn konkret haben? Bzw. was möchtest du speichern?

Zum Spiel: Grundsätzlich ist das wohl der Ansatz, mit dem die meisten Programmierer anfangen. Ich würde dir aber nahelegen, zumindest nicht allzu tolle Grafik o.ä. zu erwarten. Siehe dazu auch "Häufige Fragen und Irrtümer" im Forum.

Gruss
cwriter
 
Zuletzt bearbeitet:
Da ich es ja schon ausgesprochen habe, dass ich ein Spiel machen will, möchte ich mehrere Sachen speichern und zwar neben den Sachen die man angeben MUSS wie Nutzername oder eben Passwort. Dazu zählen auch ein Clan-Tag, eine Forumsignatur und solche Sachen die man halt angeben kann aber nicht muss.

Und mit der Grafik: Die Engine werde ich nicht selber programmieren, falls du das damit meinst^^
 
Ok danke. Aber kann mir dann vielleicht einer genau erklären was es mit
C++:
sscanf(temp, "%[^=]=%s;", nutzername, pweingabe2);
auf sich hat bzw. mir erklären was die Zeichen zu bedeuten haben?
 
Hallo

ich habe aber eigentlich den eher kryptischen Teil davon gemeint^^ %[^=]=%s;
Auch das steht in Cromons Link.
"%[^=]" liest alle Zeichen, die nicht ein '=' sind, in einen String (negative scanset).
"%s" liest alle Zeichen, die nicht Whitespaces (Tabulator ('\t'), Space (' '), Newline ('\n'), sind, in einen String.
D.h.: Statt "%[^=]=%s;" könntest du auch "%[^=]=%[^;];" schreiben.
Nun: Damit '=' nicht im 2. String auftaucht, muss angegeben werden, dass wir das ignorieren. Daher schreibt man noch ein '='.

Wenn man nur alphabetische Zeichen haben will, ginge das so: "%[A-Za-z]" (scanset). (ungetestet).

Gruss
cwriter
 
Zurück