Bestimmten Teil aus Datei entfernen.

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag


    Ich möchte einen bestimmten Teil eines Strings aus der Datei löschen.


    Die Datei sieht zumbeispiel wiefolgt aus:


    Mario
    Werner
    Peter
    Harald
    ...


    Nun möchte ich zum Beispiel "Werner" rauswerfen und die Datei soll nun so aussehen:


    Mario
    Peter
    Harald
    ...


    Gibt es da eine bestimmte Funtion die einen bestimmten Teil entfernt? oder muss ich mit ner While schleife alle Reihen durchgehen und in einem stringspeichern mit ausnahme dieser Reihe und diesen String dann in die Dateischreiben?


    LG
    Simon


    //edit: Ich habe mir nun folgende Funtkionen gemacht: AddUser und DelUser.


    stock AddUser(Username[30])
    {
    new File:UserFile = fopen("UserNames.ini",io_append);
    strcat(Username,"\r\n");
    fwrite(UserFile, Username);
    fclose(UserFile);
    return 1;
    }


    stock DelUser(Username[30])
    {
    new File:UserFile = fopen("UserNames.ini", io_read);
    new sBug[500], str[30];
    sBug[0] ='\0';
    while(fread(UserFile, str))
    {
    if(!strcmp(str,Username,true,strlen(str))) return 1;
    else format(sBug,sizeof(sBug),"%s%s",sBug,str);
    }
    fclose(UserFile);
    UserFile = fopen("UserNames.ini", io_write);
    fwrite(UserFile,sBug);
    fclose(UserFile);
    return 1;
    }


    Bei DelUser will er den Namen nicht rauslöschen. er ließt ihn trotzdem mit.

    Einmal editiert, zuletzt von Simon ()

  • Das ist sehr umständlich eine Zeile aus einer Datei zu löschen.
    Man muss sich zuerst eine TEMP - Datei erstellen, in der man alles rein schreib, was man möchte.
    In deinem Fall alle Namen, außer den, den du löschen möchtest. Dann schließt man beide Datein wieder.
    Löscht die Ausgangsdatei und erstellt sie neu. Jetzt schreibt man den kompletten Inhalt aus der TEMP - Dateiin die Ausgangsdatei , die wir gerade neu erstellt haben.
    Hab es hier schon mal beschrieben.


    Es gab dafür auch mal eine Funktion , fremoveline. Die findet man aber nicht mehr :-0 .

  • Okay, dankeschön, werde ich mal versuchen..


    //edit: ich könnte auch nachdem ich 1. datei gelesen habe einfach überschreiben und den string leer lassen oder würde das crashen?


    also fwrite(datei,"");


    dann brauche ich sie nicht löschen und neu erstellen..

  • Ja stimmt.. Okay ich habe es nun soweit. nur iwie hat meine Abfrage gerade schon rumgespackt, ob der name in der Reihe steht.


    stock DelUser(Username[30])
    {
    new File:UserFile = fopen("UserNames.ini", io_read);
    new str[30];
    new File:UserFile2 = fopen("UserNames_Temp.ini",io_append);
    while(fread(UserFile, str))
    {
    fwrite(UserFile2,str);
    }
    fclose(UserFile);
    fclose(UserFile2);
    fremove("UserNames.ini");
    UserFile = fopen("UserNames.ini",io_append);
    UserFile2 = fopen("UserNames_Temp.ini",io_read);
    while(fread(UserFile2, str))
    {
    fwrite(UserFile, str);
    }
    fclose(UserFile);
    fclose(UserFile2);
    fremove("UserNames_Temp.ini");
    return 1;
    }


    Meine ABfrage wäre nun:
    if(strcmp(str,Username,true,strlen(str))) //Falls username nicht mit der gelesenen Reihe übereinstimmt.

  • Die ist wirklich ganz schön lang. also meine funktioniert auch soweit: er schreibt datei 1 in datei 2 und datei 2 in datei 1 :D nur überspringt er dabei nicht den gewünschten Namen.


    Das liegt wohl an meiner Abfrage.


    Ich baue mal deins ein


    //edit: deine StripNewLine funktion verstehe ich nicht ganz. wo ist da die datei in der eine neue zeile gemacht werden soll?


    //edit: ahh nu hab ichs gescheckt :D:D die hängt mit der oberen funktion zusammen :D


    //edit: Habe es nun wie folgt eingebaut:

    OnPlayerCommandText(playerid,cmdtext[])
    {
    if(!strcmp("/test", cmdtext, true))
    {
    DelUser("UserFiles.ini","Simon");
    }
    return 1;
    }


    stock DelUser( const file[] , text[] )
    {
    new File: fFile, File: fTemp, sTmp[128];
    fFile = fopen( file , io_read );
    if(!fFile) return 0;


    format(sTmp,sizeof(sTmp),"%stmp",file);
    fTemp = fopen( sTmp , io_write );
    if(!fFile) return 0;
    while( fread(fFile,sTmp,sizeof(sTmp)) )
    {
    StripNewLine( sTmp ); // StripNL
    if(!sTmp[0]) continue; // Leere Zeilen brauchen wir nicht
    if(!strcmp( sTmp, text ) ) continue; // Zeile wollen wir löschen! Also skippen
    strcat( sTmp, "\r\n" );
    fwrite( fTemp , sTmp );
    }
    fclose( fFile );
    fclose( fTemp );
    fremove( file );


    fFile = fopen( file , io_write );
    if(!fFile) return 0;


    format(sTmp,sizeof(sTmp),"%stmp",file);
    fTemp = fopen( sTmp , io_read );
    if(!fTemp) return 0;
    while( fread(fTemp,sTmp,sizeof(sTmp)) )
    {
    StripNewLine( sTmp ); // StripNL
    if(!sTmp[0]) continue; // Kann man eventuell entfernen
    strcat( sTmp, "\r\n" );
    fwrite( fFile , sTmp );
    }
    fclose( fFile );
    fclose( fTemp );


    format(sTmp,sizeof(sTmp),"%stmp",file);
    fremove( sTmp );
    return 1;
    }


    stock StripNewLine(str[]) //ysi_misc.own
    {
    new
    l = strlen(str);
    while (l-- && str[l] <= ' ') str[l] = '\0';
    }


    Jedoch wird der Name immernoch nicht gelöscht.. :S


    //edit: habe den Fehler gefunden... klappt nun wunderbar, Danke..


    //Edit:


    Nu Habe Ich folgendes Problem. Beim registrieren wird der Name in die Datei hinzugefügt.
    Bem GM start wird nun überprüft, ob der name in der datei als spielerdatei existiert. das wird benötigt um sämtliche dateien zu überprüfen, falls eine Userdatei mal gelöscht werden sollte.
    Also lese ich die datei reihe für reihe aus und überprüfe ob die userdatei existiert. Da ich aber nach jeden Namen eine Neue Zeile beginne (\r\n) bekommt der Name ein zeichen mehr und somit kann man nicht mehr überprüfen ob es die datei gibt. die wird es nämlich nicht geben mit einem zeichen mehr.


    Nun wäre es sehr gut wenn mir einer erklären würde wie ich dieses Zeichen hinten dran entfernen könnte..


    LG
    Simon

    Einmal editiert, zuletzt von Simon ()

  • Dafür habe Ich StripNewLine genommen.


    Könnte zB so aussehen:
    while( fread(fFile,sTmp,sizeof(sTmp)) )
    {
    StripNewLine( sTmp );
    if(!sTmp[0]) continue;
    if(!strcmp( sTmp, text ) ) {
    // eintrag gefunden!
    }
    }


    Warum benutzt du aber nicht direkt fexist um zu prüfen, ob es den User bereits gibt ?