Beim Speichern automatisch eine Dateiendung beifügen



  • das dürfte eigentlich nicht sein es sind doch datei name aka "test.txt.txt" erlaubt? ist der buffer wo du das reinspeicherst auch groß genug?



  • Hallo,

    das kann nicht daran liegen, dass "Selbsteingabe" der Endung möglich ist. Wahrscheinlicher ist, dass neuerdateiname (auch bei dateiname muss man mit der Grösse aufpassen) zu klein ist für den Inhalt, der dort jetzt hinein soll.

    MfG,

    Probe-Nutzer



  • FreshAC schrieb:

    Christian122 schrieb:

    Schau dir mal sprintf an. Damit kannst du dir deinen Dateinamen zusammenfügen.

    Beispiel:

    sprintf (neuerdateiname, "%s.txt",dateiname);
    

    Gruß Christian

    Super! Das funktioniert schon mal. Aber wenn ich eine Endung selber eingebe, stürtzt das Programm ab. Kann man das umgehen, dass er das .txt das ich eingebe ignoriert.

    Du meinst, wenn ".txt" schon drin ist, daß dann kein zweites angehängt wird? Dann mußt Du vorher überprüfen, ob der Teilstring im Dateinamen schon vorhanden ist. Machst Du am besten mit strncmp.



  • noobLolo schrieb:

    das dürfte eigentlich nicht sein es sind doch datei name aka "test.txt.txt" erlaubt? ist der buffer wo du das reinspeicherst auch groß genug?

    Tatsache der buffer war eindeutig zu klein, jedoch speichert er meine Datei jetzt mit dem Namen: "Dateiname.txt.txt" ab. Wie kriege ich das erste .txt weg?



  • pointercrash() schrieb:

    Du meinst, wenn ".txt" schon drin ist, daß dann kein zweites angehängt wird? Dann mußt Du vorher überprüfen, ob der Teilstring im Dateinamen schon vorhanden ist. Machst Du am besten mit strncmp.

    Kannst du mir vielleicht ein Beispiel für so eine Funktion geben. Ich blicke in deiner beigefügten Seite nicht durch.



  • if ((strlen(dateiname) < 4) || (strlen(dateiname) >= 4) && strcmp(dateiname + strlen(dateiname) - 4, ".txt")) /* hänge .txt an */
    else /* hänge .txt nicht an */
    


  • ach jetzt hat nwp2 schon was da, aber löschen werd ichs jetzt auch nicht mehr also ab die post;)

    so in der richtung also die function lässt auf die eingabe vom user los

    int removeFileEnd(char *input){
      int l = strlen(input)-1;
      if(l>3){
        if(input[l]=='t'
        && input[l-1]=='x'
        && input[l-2]=='t'
        && input[l-3]=='.'){
          input[l-3] = '\0';
          return 1;
        }
      }
      return 0;
    }
    

    könntest theoretisch auch in eine schleife packen also

    char input[]="hi.txt.txt.txt.txt";
    while(removeFileEnd(input));
    

    hoffe das klappt so 😕



  • nwp2 schrieb:

    if ((strlen(dateiname) < 4) || (strlen(dateiname) >= 4) && strcmp(dateiname + strlen(dateiname) - 4, ".txt")) /* hänge .txt an */
    else /* hänge .txt nicht an */
    

    Klasse! Jetzt funktioniert auch das! Großes Dankeschön.



  • FreshAC schrieb:

    nwp2 schrieb:

    if ((strlen(dateiname) < 4) || (strlen(dateiname) >= 4) && strcmp(dateiname + strlen(dateiname) - 4, ".txt")) /* hänge .txt an */
    else /* hänge .txt nicht an */
    

    Klasse! Jetzt funktioniert auch das! Großes Dankeschön.

    aber streich das: (strlen(dateiname) < 4) || (strlen(dateiname) >= 4)
    ergibt immer true, ein NOP sozusagen. tut nichts, verbrennt nur taktzyklen *fg*
    🙂



  • ;fricky schrieb:

    FreshAC schrieb:

    nwp2 schrieb:

    if ((strlen(dateiname) < 4) || (strlen(dateiname) >= 4) && strcmp(dateiname + strlen(dateiname) - 4, ".txt")) /* hänge .txt an */
    else /* hänge .txt nicht an */
    

    Klasse! Jetzt funktioniert auch das! Großes Dankeschön.

    aber streich das: (strlen(dateiname) < 4) || (strlen(dateiname) >= 4)
    ergibt immer true, ein NOP sozusagen. tut nichts, verbrennt nur taktzyklen *fg*

    ^^ ach, stimmt ja garnicht. klammern übersehen.
    🙂



  • Garnicht. && bindet stärker als ||, und es bewirkt dass das Programm bei Dateinameneingabe mit Länge <4 nicht abstürzt, was vorkommen kann, da der durchschnitts-DAU einfach immer nur enter drückt.



  • ;fricky schrieb:

    FreshAC schrieb:

    nwp2 schrieb:

    if ((strlen(dateiname) < 4) || (strlen(dateiname) >= 4) && strcmp(dateiname + strlen(dateiname) - 4, ".txt")) /* hänge .txt an */
    else /* hänge .txt nicht an */
    

    Klasse! Jetzt funktioniert auch das! Großes Dankeschön.

    aber streich das: (strlen(dateiname) < 4) || (strlen(dateiname) >= 4)
    ergibt immer true, ein NOP sozusagen. tut nichts, verbrennt nur taktzyklen *fg*
    🙂

    Es werden trotzdem sinnlos Takte verbrannt; ich weiß nicht, wie gut eure compiler optimieren, aber wenn ich ein len = strlen(dateiname) voranschicke und das if- Argument auf len statt der strlen- Aufrufe reinschreibe, steht mein Zyklenzähler auf einer deutlich kleineren Zahl ... 😃



  • ^^ und ich frage mich, ob's ein:

    if (strstr (dateiname, ".txt") == 0)  
      strcat (dateiname, ".txt");
    

    nicht auch tun würde.
    🙂



  • ;fricky schrieb:

    ^^ und ich frage mich, ob's ein:

    if (strstr (dateiname, ".txt") == 0)  
      strcat (dateiname, ".txt");
    

    nicht auch tun würde.
    🙂

    Achja, weil einfach einfach einfach ist? Iss ja fies! 😉



  • pointercrash() schrieb:

    [Achja, weil einfach einfach einfach ist? Iss ja fies!

    naja, das hat schon den nachteil, dass '.txt' auch mitten drin sein darf, um gefunden zu werden. aber vielleicht reichts ja trotzdem.
    🙂



  • dann machts doch so

    if (strstr(dateiname, ".txt")!= &dateiname[len - 5])
      strcat(dateiname, ".txt");
    

    Ihr macht euch das leben wohl gerne kompliziert 🙂



  • ;fricky schrieb:

    pointercrash() schrieb:

    [Achja, weil einfach einfach einfach ist? Iss ja fies!

    naja, das hat schon den nachteil, dass '.txt' auch mitten drin sein darf, um gefunden zu werden. aber vielleicht reichts ja trotzdem.
    🙂

    Seltsam eigentlich, ich frag mich hin und wieder, warum der Standard kein memmem() kennt, damit müsste man nur nach .txt mit Null danach suchen.
    🙂



  • player4245 schrieb:

    dann machts doch so

    if (strstr(dateiname, ".txt")!= &dateiname[len - 5])
      strcat(dateiname, ".txt");
    

    ^^auch doof, wenn 'len' kleiner als 5 ist.
    🙂



  • Wäre schon sinnvoller strlen in einer Variablen zu speichern. Ich hatte auch dran gedacht, aber dann war mir irgendwie nicht danach, zu faul. Trotzdem bin ich kein Freund von "vielleicht reichts ja". Das ist wie buffer[wirdschonreichen]. Mit ineffizient kann ich leben, mit inkorrekt nicht.
    Wahrscheinlich ist lolos Version am besten; korrekt und schnell, mal davon abgesehen dass ich mir den Funktionsaufruf sparen würde.



  • dann sorg dafür das len nicht kleiner als 5 ist. Bei nem statischen buffer wäre das auch ziemlich sinnfrei. Und wenn du den Speicher dynamisch reservierst machst du halt vornedran eine Abfrage.


Anmelden zum Antworten