Beim Speichern automatisch eine Dateiendung beifügen



  • 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.



  • Wieso ist das sinnfrei? Ich kann meine Datei doch "123" nennen wenn ich will.



  • In wenigen Fällen wird es vorkommen dass ein Dateiname nur 5 Zeichen lang ist. Schon allein die Endung verbraucht ja 4 Zeichen.



  • Es geht ja darum dass der Benutzer eben keine Dateiendung eingibt. Drum soll die ja angehängt werden, falls er das nicht macht.



  • nwp2 schrieb:

    Trotzdem bin ich kein Freund von "vielleicht reichts ja".

    bei 'nem filesystem, das keine punkte im namen erlaubt (FAT 8.3 z.b.), reichts ja tatsächlich.
    btw, vielleicht noch der hier:

    char *found = strstr (dateiname, ".txt");  
    if (found == 0 || found[4] != 0)
    {
      strcat (dateiname, ".txt");
    }
    

    🙂



  • player4245 schrieb:

    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.

    Wie ist das eigentlich? Windows macht zB Beschränkungen der Pfadangaben auf MAX_PATH, machen das die Unix-Leute auch so? Jedenfalls würde ich nach solchen Grenzen Ausschau halten, wenn es um die Puffergrösse geht, anstatt hier mit realloc() herumzubasteln.
    🙂



  • ;fricky schrieb:

    char *found = strstr (dateiname, ".txt");  
    if (found == 0 || found[4] != 0)
        ...
    

    Das ist nett, und man versteht's auch sofort.
    🙂



  • µngbd schrieb:

    Das ist nett, und man versteht's auch sofort.

    Hmm. Andererseits: wenn in dem String viele Vorkommen von .txu sind, wird man wahrscheinlich mit strlen() besser dran sein.
    🙂


Anmelden zum Antworten