Dateinamen Hochzählen, also das nicht überschrieben wird



  • Schönen guten Abend zusammen, ich hätte früher geschrieben aber das Forum war wieder down (deutet wohl auf die starke Beliebtheit hin 😃 ), jedenfalls konnte ich die zeit gut nutzen und bei googel was zu suchen und dann feststellen zu müssen das ich nicht so wirklich was gefunden hab 😞

    Also zu meinem Problemchen 🙂
    ich möchte gerne neue Dokumente erstellen die den gleichen Namen haben aber jeweils ne Nummer noch hinten dran also so wie bei Windows
    Neu Textdokument.txt
    Neu Textdokument (2).txt
    Neu Textdokument (3).txt
    ....
    ich hab jetzt mit googel gefunden das das am besten mit einer for schleife realisiert werden soll aber ich weis nicht wie ich jetzt die neue Datei erstelle und dann diese for schleife an den Dateinamen hänge.

    also das wäre hier der Ansatz der for schleife:

    for (int i=0;i<=500;i++)
    {
    ...
    }
    

    gibt es eine möglichkeit das er nicht bis 500 oder so hochzählt sonder bis unendlich?

    ich hoffe man konnte mich einigermaßen gut verstehen :p
    mfg
    n0et



  • Hallo

    aber ich weis nicht wie ich jetzt die neue Datei erstelle und dann diese for schleife an den Dateinamen hänge.

    Das hängt ja erstmal davon ab, was du für Dateien mit welchen Klassen erstellen willst. Ich geh mal von normalen Textdateien aus, dann bietet sich TStringList an.

    gibt es eine möglichkeit das er nicht bis 500 oder so hochzählt sonder bis unendlich?

    Unendlich natürlich nicht, aber bis zur normalen Interger-Grenze (bei 4 Milliarden...) ist das nicht schwierig.

    unsigned int index = 0;
    TStringList* file = new TStringList();
    while (/* hier deine Abbruchbedinung*/)
    {
      file->Clear();
      file->Add(...); // Datei fühlen
      file->SaveToFile("File_" + IntToStr(index) + ".txt"); // Dateinamen zusammensetzen
      index++; // zum nächsten Index 
    }
    delete file;
    

    bis bald
    akari



  • n0et schrieb:

    gibt es eine möglichkeit das er nicht bis 500 oder so hochzählt sonder bis unendlich?

    hi namensvetter 😉
    du könntest sowas versuchen wenn's eine riesige zahl werden soll:

    // gibt nach jedem aufruf eine nummer aus, die um 1 hochgezählt wurde
    char *count (void)
    {
    	static char number[] = "00000000000";  // können auch viel mehr nullen sein
    	int l = strlen (number) - 1;
    
    	increment_digit:
    	number[l]++;
    	if (number[l] > '9')
    	{
    		number[l] = '0';
    		l--;
    		goto increment_digit;
    	}
    
    	return number;
    }
    


  • Hallo
    @akari
    das ist schon mal gut mit dem weiterzählen, aber ich wollte nicht das er die 500 Dateien auf einmal erstellt sondern das wenn man auf den Knopf klickt eine Datei erstellt wird aber vorher kontrollieren soll ob die Datei(en) vorhanden sind und dann eine neue erstellt und die Zahl dann hinten um eins erhöht

    hi namensvetter 😉

    Hi 🙂
    also ich denke 4 Milliarden sollten mir ausreichen 😉

    aber danke für die Hilfe euch beiden 👍



  • Hallo
    Du kannst mit FileExists prüfen, ob die Datei besteht und u.U. die Dateinummer erhöhen.
    Oder Du speicherst die aktuelle Zahl der Dateien und kannst somit einfacher auf die Anzahl zugreifen.

    Gruss



  • So hab es mit FileExists versucht irgendwie aber es geht nicht so richtig, es funktioniert nur wenn File_0.txt vorhanden ist und wenn ich auf den Button klicke erstellt er mir wieder alle Dateien, kann mir einer sagen was ich da falsch gemacht hab?

    unsigned int i = 0;
    TStringList* file = new TStringList();
    
    if (FileExists("File_" + IntToStr(i) + ".txt"))
    {
     for (int i=0;i<=5;i++)
     {
     file->Add("Test");
     file->SaveToFile("File_" + IntToStr(i) + ".txt");
     }
    }
    delete file;
    

    Bitte nicht hauen wenn der code bisschen doof is, ich bin noch ein noob 😞

    mfg
    n0et



  • Hallo

    Das von dir beschrieben Verhalten passt genau zu dem Code.
    Vielleicht solltest du erstmal den Ablauf überdenken, den das Programm für deinen gewünschten Effekt machen muß. Hm, vielleicht sind Struktogramme für Anfänger doch ganz gut?

    bis bald
    akari



  • Für das Verständnis wäre vielleicht eine while-Schleife besser:

    int x = 0;
    bool DateiBesteht = true;
    while(DateiBesteht)
    {
      if(FileExists("File_" + IntToStr(x))
      {
        // Datei besteht, also x erhöhen
      }
      else
      {
        DateiBesteht = false;  // Abbruch der Schleife
        // Datei erstellen
      }
    }
    


  • So, nachdem ich den ganzen Sonntag damit verbracht hab das zum laufen zu kriegen geht es jetzt endlich 😃

    hier meine Lösung, könnt ja mal reinschauen und evtl Verbesserungsvorschläge geben

    TStringList *count = new TStringList();
     count->LoadFromFile("count.txt");
     Edit1->Text = count->Strings[0];
     i = StrToInt(Edit1->Text);
     i++;
     Edit1->Text=IntToStr(i);
     count->Clear();
     count->Add(Edit1->Text);
     count->SaveToFile("count.txt");
     delete count;
    
     TStringList *neu = new TStringList();
     neu->Clear();
     neu->SaveToFile("File_" + IntToStr(i) + ".txt");
     delete neu;
    

    die edit ist eigentlich nur da weil ich es nicht gleich geschafft hab den String in ein Integer um zu wandeln 🙄

    mfg
    n0et



  • Hallo

    die edit ist eigentlich nur da weil ich es nicht gleich geschafft hab den String in ein Integer um zu wandeln

    Warum nicht?

    i = StrToInt(count->Strings[0]);
    

    bis bald
    akari



  • oder

    i = count->Strings[0].ToInt();
    

Anmelden zum Antworten