Datei nach Text durchsuchen und ein Wort ersetzen

Tyroun

Grünschnabel
Hallo,

ich hätte eine Frage und zwar, will ich in meinem Programm(in C geschrieben) eine Datei mit ID Username und Passwort, nach einem bestimmten Username durchsuchen und nur das Passwort ändern (quasi das alte Passwort mit dem neuen überschreiben).
Die Textdatei sieht so aus:

ID Username Passwort
1 Test Test123

Ich habe bis jetzt keine Lösung gefunden.
Könnte mir hierbei jemand helfen wie ich das realisieren kann?

Ich bedanke mich schonmal :)

Grüße
Tyroun
 

Yaslaw

n/a
Moderator
Kann kein C. Aber das schreit nach einem RegEx-Replace. Den gibts sicher auch in C

Code:
Pattern: ^(\d+\s+Test+\s+)\S+$
Replace: $1NeuesPasswort
Flags: Multiline
ggf ist bei c nit $1 sond \1 oder sonstwas.

Ps. Ich hoffe für dich, dass die Passwörter verschlüsselt sind....
 

Tyroun

Grünschnabel
Wo genau ist denn das Problem?
Und poste mal den relevanten Code!
VG Klaus

Hey,

also mein Problem genau ist ich weis nicht, wie ich ein wort in einer Datei überschreiben kann :)

C:
void Changepw(){            //Passwort des Users wird geändert
    char buff[255];
    unsigned char len;
    FILE * fp;
    fp = fopen("User.txt","r+");

    while(EOF != fgetc((FILE*)fp)){
          fscanf(fp,"%s",buff); //id
          fscanf(fp,"%s",buff);//benutzername
          len=strlen(userbuf.password);

          if(!strcmp(buff,userbuf.benutzername)){
            while(1){
                printf("Geben Sie bitte ein neues Passwort ein: ");
                fgets(userbuf.password,255,stdin);
                if(pwok()){
                    break;
                }
                printf("Passwort entspricht nicht den Anforderungen!\n");
            }
            //Hier sollte das alte passwort überschireben werden, was aber unter windows nicht funktioniert.
            fseek(fp,-len-1,SEEK_CUR);
            snprintf(buff,"%s%ds","%s%",len-4);
            fprintf(fp,buff,userbuf.password,"\n");

            break;
          }
    }
    fclose(fp);
Ich habe diesen Code für die Passwortänderung von einem Kumpel bekommen, aber der funktioniert nur auf Linux und nicht auf Windows, daher brauch ich eine andere Lösung.
ich arbeite auch mit structs also die ID, das Passwort und der Benutzername werden in folgendes struct geschrieben und dann in der Datei abgelegt mit folgender Funktion.

Code:
struct user{                    //struct für einen user definieren
    char benutzername[255];
    char password[255];
    char id[255];
}userbuf; 

void saveUser(){            //User wird in eine Datei geschrieben
    FILE * user;
    user = fopen("User.txt","a+");
    fprintf(user," %d %s %s",count,userbuf.benutzername,userbuf.password);
    fclose(user);
    setupcount();
}

Ich hoffe die Infos helfen weiter.
LG
 

Tyroun

Grünschnabel
Kann kein C. Aber das schreit nach einem RegEx-Replace. Den gibts sicher auch in C

Code:
Pattern: ^(\d+\s+Test+\s+)\S+$
Replace: $1NeuesPasswort
Flags: Multiline
ggf ist bei c nit $1 sond \1 oder sonstwas.

Ps. Ich hoffe für dich, dass die Passwörter verschlüsselt sind....

Danke für die Antwort ich werde das mal ausprobieren.
LG
 

Trulleberg

Mitglied
Solange immer genau 3 Worte in einer Zeile vorkommen, funktioniert Folgendes:
C:
int main()
{
  char s1[80], s2[80], s3[80], *b = calloc(1, 100000), *alt = "vorher", *neu = "nachher";
  FILE* f = fopen("User.txt", "r+");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " ");
    if (strcmp(s3, alt)) strcat(b, s3); else strcat(b, neu);
    strcat(b, "\n");
  }
  rewind(f);
  fputs(b,f);
  fclose(f);
  free(b);
}
 
Zuletzt bearbeitet:

Tyroun

Grünschnabel
Hey,

danke für dir Antwort.
ich habe den Code mal eingefügt, aber dies funktioniert nicht und danach sagt mit das Programm das der Benutzername nicht existiert.
Hier ist mal der vollständige Code von mir, vielleicht hab ich es falsch eingefügt.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <unistd.h>
#include <sys/stat.h>

void Login_or_Register(); //bekannt machen der Funktion Login_or_Register
void Registr();           //bekannt machen der Funktion Registr
void Login();             //bekannt machen der Funktion Login
void Changepw();          //bekannt machen der Funktion Changepw
bool usernameFree();      //bekannt machen der Funktion usernameFree
bool pwok();           //bekannt machen der Funktion pwbloed
void Menu();              //bekannt machen der Funktion Menu
void init();
bool laengekorrekt();
bool istsonderzeichen(char);
bool hatGrossbuschstabe();
bool hatSonderzeichen();
int count = 0;            //bekannt machen der Variable count


struct user{                    //struct für einen user definieren
    char benutzername[255];
    char password[255];
    char id[255];
}userbuf;                       //struct userbuf anlegen

struct bedingung{               //struct für das zwischenspeichern der Passwortbedingungen
    int laenge;
    char sonder[10];
    bool upchar;
}pwdbedingung;

unsigned char state = 1; //Variable für switch Statement

int main(){
    init();
    while(1){
        switch(state){                              //steuerung der Funktionsaufrufe
            case 1: Login_or_Register(); break;
            case 2: Registr(); break;
            case 3: Login(); break;
            case 4: Menu();break;
            case 5: Changepw(); break;

        }
    }
}

void Login_or_Register(){   //Funktion für das Auswählen von anmelden oder registrieren
    char a[1];
    printf("a for Login or r for register \n");
    while(1){
        fgets(a,16,stdin);
        if(a[0] == 'a'){
            state = 3; break;
        }else if(a[0] == 'r'){
            state = 2; break;
        }
        printf("Nicht korrekte Eingabe");
    }
}

void Registr(){             //Registriervorgang
    while(1){
        printf("Benutername: ");
        fgets(userbuf.benutzername,255,stdin);
        userbuf.benutzername[strlen(userbuf.benutzername)-1] = 0;
        if(usernameFree()){     //ruft die Funktion userFree auf, um zu Prüfen ob es den Username schon gibt
            break;
        }
        printf("username already exists \n");
    }

        while(1){
            printf("Passwort: ");
            fgets(userbuf.password,255,stdin);


            if(pwok()){
                printf("Sie haben sich Registriert\n");
                break;
            }
            printf("Passwort entspricht nicht den Vorgaben\n");
        }
    state = 3;
    saveUser();         //speichert den User in eine Datei
}

bool laengekorrekt(){       //Überprüft ob die Länge des Passwortes den Vorgaben entspricht

    return strlen(userbuf.password) >= pwdbedingung.laenge;

}
bool hatSonderzeichen(){    //Überprüft ob das Passwort eines der Vorgegebenen Sonderzeichen hat
    for(int i = 0; i < strlen(userbuf.password);i++){
        if(istsonderzeichen(userbuf.password[i])){
            return 1; //wenn eins vorkommt bricht return die for schleife ab
        }

    }
    return 0;

}
bool hatGrossbuschstabe(){  //Überprüft ob das Passwort ein Großbuchstaben hat
    for(int i = 0; i < strlen(userbuf.password);i++){
        if(userbuf.password[i] >= 'A' && userbuf.password[i] <= 'Z'){
            return 1;
        }
    }
    return 0;
}
bool istsonderzeichen(char s){      //Geht jedes Zeichen des Passworts durch und schaut ob es eines der Vorgegebenen Sonderzeichen ist
    unsigned char c;
    for(c=0; c<strlen(pwdbedingung.sonder);c++){
       return pwdbedingung.sonder[c] == s;
    }
    return 0;
}
bool usualPw(){             //Überprüft ob es eines der angegebenen Standardpasswörter ist
    char buff[255];
    FILE * fp;
    fp = fopen("cirt-defauld-passwords.txt","r");

    while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.password)){
            fclose(fp);
            return 1;
        }
    }
    fclose(fp);
    return 0;
}
bool pwok(){                //gibt zurück ob das Passwort den Anforderungen entspricht
   return laengekorrekt()
    &&hatSonderzeichen()
    &&hatGrossbuschstabe()
    &&!usualPw();
}
bool usernameFree(){        //Überprüft ob es den Usernamen schon gibt
    char buff[255];
    FILE * fp;
    fp = fopen("User.txt","r");

    while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",buff);
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.benutzername)){
            fclose(fp);
            return 0;
        }
        fscanf(fp,"%s",buff);
    }
    fclose(fp);
    return 1;


}
bool passwortCorrect(){
        char buff[255];
        FILE * fp;
        fp = fopen("User.txt","r");

        while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",userbuf.id);
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.benutzername)){
            fscanf(fp,"%s",buff);
            fclose(fp);
            return !strcmp(buff,userbuf.password);
        }
        fscanf(fp,"%s",buff);
    }
    fclose(fp);
    return 0;

}
void log(){                 //Schreibt in eine Datei wann sich ein User angemeldet hat
    FILE * fp;
    fp = fopen("log.txt","a+");
    time_t current_time;
    char* c_time_string;
    current_time = (unsigned long)time(NULL);
    c_time_string = ctime(&current_time);
    c_time_string[strlen(c_time_string)-1]=0;
    fprintf(fp,"der User: %s mit der ID: %s hat sich zum Zeitpunkt: %s angemeldet\n ",userbuf.benutzername,userbuf.id,c_time_string);
    fclose(fp);

}
void Login(){               //Loginvorgang
    while(1){
        printf("Benutzername: ");
        fgets(userbuf.benutzername,255,stdin);
        userbuf.benutzername[strlen(userbuf.benutzername)-1]=0;
        if(usernameFree()){
            printf("Benutzer existiert nicht\n");
            continue;
        }
        break;
    }
    for(int f = 2; f >= 0;f--){
        printf("Passwort: ");
        fgets(userbuf.password,255,stdin);
        userbuf.password[strlen(userbuf.password)-1]=0;
        if(passwortCorrect()){
            printf("Sie sind eingeloggt!\n");
            break;
        }
        printf("Passwort falsch , sie haben noch %i Versuche.\n",f);
        if(!f){
            Sleep(15000);
            return ;
        }
    }
    checkMark();
    log();
    state = 4;
}
void checkMark(){           //überprüft ob der User auf der Liste mit veralteten Passwörtern steht
    char buff[255];
    FILE * fp;
    fp = fopen("uptodatepw.txt","r");

    while(!feof(fp)){
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.benutzername)){
            printf("Ihr Passwort entspricht nicht den aktuellen Vorgaben!\n");
            Changepw();
            break;
        }
    }
    fclose(fp);
}
void Changepw(){            //Passwort des Users wird geändert
      char s1[80], s2[80], s3[80], *b = calloc(1, 100000), *alt = "vorher", *neu = "nachher";
  FILE* f = fopen("User.txt", "r+");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " ");
    if (strcmp(s3, alt)) strcat(b, s3); else strcat(b, neu);
    strcat(b, "\n");
  }
  rewind(f);
  fprintf(f, "%s", b);
  fclose(f);
  free(b);
  return 0;
}
void Menu(){                //das Menü wird aufgerufen

}
void saveUser(){            //User wird in eine Datei geschrieben
    FILE * user;
    user = fopen("User.txt","a+");
    fprintf(user," %d %s %s",count,userbuf.benutzername,userbuf.password);
    fclose(user);
    setupcount();
}
void setupcount(){          //Zähler wird hochgesetzt(für die ID)
    count++;

    FILE * fp;
    fp = fopen("usercount.txt","w");
    fprintf(fp,"%i",count);
    fclose(fp);
}
void init(){                //Passwortbedingungen werden eingelesen und in den struct gespeichert
    char buff[255];
    FILE * fp;
    fp = fopen("pwd-specification.txt","r");

    fscanf(fp,"%s",buff);
    fscanf(fp,"%s",buff);//min-length
    pwdbedingung.laenge = atoi(buff);

    fscanf(fp,"%s",buff);
    fscanf(fp,"%s",buff);//charset
    strcpy(pwdbedingung.sonder,buff);

    fscanf(fp,"%s",buff);
    fscanf(fp,"%s",buff);//upchar
    pwdbedingung.upchar = strcmp(buff,"false");
    fclose(fp);

    fp = fopen("usercount.txt","r");

    fscanf(fp,"%s",buff);
    count=atoi(buff);
    fclose(fp);

    struct stat stats;
    stat("pwd-specification.txt",&stats);

    struct tm dt;

    char timeString[20];
    dt = *(gmtime(&stats.st_mtime));
    snprintf(timeString, 20, "%04d-%02d-%02d %02d:%02d:%02d",dt.tm_year + 1900, dt.tm_mon+1,dt.tm_mday,
    dt.tm_hour, dt.tm_min, dt.tm_sec);

    fp = fopen("logaenderung.txt","r");

    fscanf(fp,"%s",buff);
    fclose(fp);

    fp = fopen("logaenderung.txt","w");
    if(strcmp(timeString,buff)){
        fprintf(fp,"%s",timeString);
        checkUpdatePw();
    }
    fclose(fp);

}
void markUser(){            //schreibt die User zum überprüfen in eine Datei bei denen die Passwortvorgaben nicht mehr mit dem Passwort übereinstimmen
    FILE * fp;
    fp = fopen("uptodatepw.txt","a+");
    fprintf(fp,"%s\n",userbuf.benutzername);
    fclose(fp);
}
void checkUpdatePw(){       //liest die User mit veralteten Passwort ein

    remove("uptodatepw.txt");
    char buff[255];

    FILE * fp;
    fp = fopen("User.txt","r");

    while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",userbuf.id);
        fscanf(fp,"%s",userbuf.benutzername);
        fscanf(fp,"%s",userbuf.password);

        if(!pwok()){
            markUser();
        }
    }

}

Und im Anhang auf mal die User Datei die nach dem Benutzer durchsucht werden soll und das Passwort ersetzt werden soll.

Sorry, dass ich mich Wahrscheinlich echt dumm anstelle :(
 

Anhänge

  • User.txt
    58 Bytes · Aufrufe: 1

Tyroun

Grünschnabel
Solange immer genau 3 Worte in einer Zeile vorkommen, funktioniert Folgendes:
C:
int main()
{
  char s1[80], s2[80], s3[80], *b = calloc(1, 100000), *alt = "vorher", *neu = "nachher";
  FILE* f = fopen("User.txt", "r+");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " ");
    if (strcmp(s3, alt)) strcat(b, s3); else strcat(b, neu);
    strcat(b, "\n");
  }
  rewind(f);
  fputs(b,f);
  fclose(f);
  free(b);
}

Hey,

ich habe oben nochmal meinen kompletten Code Gepostet, weil es irgendwie nicht geklappt hat, vielleicht hab ich da was falsch gemacht. Könntest du mir vielleicht nochmal helfen? :)
LG
 

Trulleberg

Mitglied
Sinn und Zweck von Funktionen ist es NICHT, sie ohne Parameter zu gebrauchen wie du es durchgehend machst!
C:
void Changepw() {            //Passwort des Users wird geändert
  char s1[255], s2[255], s3[255], *b = calloc(1, 100000);
  FILE* f = fopen("User.txt", "r");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    if (!strcmp(s2, userbuf.benutzername))
    {
      while (1) {
        printf("Geben Sie bitte ein neues Passwort ein: ");
        fgets(userbuf.password, 255, stdin);
        userbuf.password[strlen(userbuf.password) - 1] = 0;
        if (pwok()) {
          break;
        }
        puts("Passwort entspricht nicht den Anforderungen!");
      }
      strcpy(s3, userbuf.password);
    }
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " "); strcat(b, s3); strcat(b, "\n");
  }
  fclose(f); f = fopen("User.txt", "w"); fputs(b, f); fclose(f);
  free(b);
}
 

Tyroun

Grünschnabel
Sinn und Zweck von Funktionen ist es NICHT, sie ohne Parameter zu gebrauchen wie du es durchgehend machst!
C:
void Changepw() {            //Passwort des Users wird geändert
  char s1[255], s2[255], s3[255], *b = calloc(1, 100000);
  FILE* f = fopen("User.txt", "r");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    if (!strcmp(s2, userbuf.benutzername))
    {
      while (1) {
        printf("Geben Sie bitte ein neues Passwort ein: ");
        fgets(userbuf.password, 255, stdin);
        userbuf.password[strlen(userbuf.password) - 1] = 0;
        if (pwok()) {
          break;
        }
        puts("Passwort entspricht nicht den Anforderungen!");
      }
      strcpy(s3, userbuf.password);
    }
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " "); strcat(b, s3); strcat(b, "\n");
  }
  fclose(f); f = fopen("User.txt", "w"); fputs(b, f); fclose(f);
  free(b);
}

Perferkt vielen vielen Dank.
Es funktioniert :)

LG