2017-04-22 5 views
-3

Ich versuche, ein einfaches Login-System, basierend auf txt zu machen. Die file sieht aus wieC Programmierung Login-System

1 1 
2 2 
3 3 

Aber meine Codeprüfung nur letzte Zeile txt, nicht jede Zeile.

int write_login_and_pass() { 
    char login[30], pass[30]; 
    int select3; 

    printf("\n|---------Login:"); 
    scanf("%s", login); 
    printf("|---------Password:"); 
    scanf("%s", pass); 

    sign_In(login, pass); 
    _getch(); 
    system("PAUSE"); 
    return 0; 
} 
int sign_In(char login[30], char pass[30]) { 
    FILE *file; 
    char user2[30], pass2[30], fc; 
    file = fopen("Customers.txt", "r"); 
    char arra[128][128]; 

    if (file != NULL) { 
     char line[128]; 
     do { 
      fscanf(file, "%29s %29s", user2, pass2); 
     }while (fgets(line, sizeof line, file) != NULL); 
       if ((strcmp(login, user2) == 0) && (strcmp(pass, pass2) == 0)) { 
        printf("\n>>>User and password correct!<<<\n"); 
        fc = main_menu(); 
       } 
       else { 
        printf("\n>>>User or password incorrect!<<<\n"); 
        system("PAUSE"); 
        fc = sign_In(login, pass); 
       } 
    } 
    else printf("File was not founded"); 
    fclose(file); 
    system("PAUSE"); 
    return 0; 
} 
+0

Lesen Sie sorgfältig die Dokumentation jeder aufgerufenen Funktion (wie [fscanf] (http://en.cppreference.com/w/c/io/fscanf), whos Der Rückgabewert sollte überprüft werden). Kompilieren Sie alle Warnungen und Debug-Informationen (z. B. 'gcc -Wall -g 'bei Verwendung von [GCC] (http://gcc.gnu.org/) ...). Verbessere deinen Code, um keine Warnungen zu erhalten. ** Verwenden Sie den Debugger ** 'gdb'. –

+1

Sehen Sie sich Ihre Schleife beim Lesen der Datei genauer an. Und wenn Sie es nicht direkt sehen können, nehmen Sie sich bitte etwas Zeit [lesen Sie, wie Sie kleine Programme debuggen können] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) und lernen, wie man einen Debugger benutzt, um Code Zeile für Zeile durchzugehen. –

+1

Ihre * fix-my-code * -Frage ist nicht am Thema. –

Antwort

1

Problem ist hier:

do 
{ 
     fscanf(file, "%29s %29s", user2, pass2); // 1) 
} 
while (fgets(line, sizeof line, file) != NULL); // 2) 

Zuerst Sie lesen 1) in einem Paar von Benutzer-Passwort, dann Sie versuchen, das Ende der Linie 2) zu lesen - aber auf Erfolg, wie in einer while-Schleife, erneut eingeben Sie, bevor die Passwörter so weit ... jetzt

Zwei Optionen lesen ausgewertet haben, erstens, die einfach:

char user2[30], pass2[30], fc; 
file = fopen("Customers.txt", "r"); 
if (file) 
{ 
    while(fscanf(file, "%29s %29s", user2, pass2) == 2) 
    { 
     // do comparisons here 
    } 
    fclose(file); 
} 

Beachten Sie, dass Sie absolut auf das richtige Dateiformat verlassen, i. e. immer nach einem Benutzer durch sein/ihr zugehörige Passwort gefolgt – Leerzeichen keine Rolle spielt, durch die Art und Weise, so könnte die Datei auch wie folgt aussehen:

u1 p1 
u2 
p2 u3 
p3 u4 p4 

jedoch ein einziges Mal eines der Paare fehlen, Ihre Login ist ganz gebrochen!

Zweite Option: Lesen Zeile für Zeile:

char user2[30], pass2[30], line[128]; 
file = fopen("Customers.txt", "r"); 
if (file) 
{ 
    while(fgets(line, sizeof line, file) 
    { 
     if(sscanf(line, "%29s %29s", user2, pass2) == 2) 
     //^(!) 
     { 
      // do comparisons here 
     } 
     // else: line is invalid! 
    } 
    fclose(file); 
} 

Ich persönlich würde strtok statt sscanf bevorzugen, obwohl, wie Sie auf diese Weise die Saiten nicht kopieren müssen:

char *user2, *pass2, line[128]; 
file = fopen("Customers.txt", "r"); 
if (file) 
{ 
    while(fgets(line, sizeof line, file) 
    { 
     if((user2 = strtok(line, " \t") && (pass2 = strtok(NULL, " \t")) 
     { 
      // do comparisons here 
     } 
     // else: line is invalid! 
    } 
    fclose(file); 
} 

(Einziges Manko: strtok ist nicht thread safe)