Problem: strcat mehrmals benutzen



  • Hallo C++ Profis,

    ich sitze an einem Problem, das ich vielleicht auf verschiedene Arten lösen könnte, jedoch eines bevorzugen würde:

    Ich bearbeite viele .txt-Dateien, die - mit unregelmässigen Abständen - nach Uhrzeiten in Form von yyyymmddhhmm.txt (z.B. 1991 Nov 12, 15:33 --> 199111121533.txt) gespeichert sind.
    Zur Zeit lese ich sie nach folgendem Schema ein:

    const int anfang = 11120847;   //Anfang und ende in mmddhhmm, Jahreszahl in der path-Angabe
    	const int ende = 11221036;  
    	const int diff = ende - anfang + 1;
    
    	char* radinfile[diff];
    
    	for (int r = anfang; r <= ende; r++)
    	{ 
    		char path[80] = "d:\\...\\1991"; 
    
    		ostringstream buf;
    		buf << r;
    		string num = buf.str();
    		const char* number = num.c_str();			
    		strcat(path, number);			
    		strcat(path, ".txt");		
    		radinfile[r-anfang] = path;
    
    		char output[80] = "d:\\...\\1991"; 								
    		ifstream in;		
    		in.open(radinfile[r-anfang]);	
    		char* inputfile = radinfile[r-anfang];
    
                if (in != NULL)    //Kontrolle, ob vorhandene Nummer auch als datei existiert
    		{ 
                strcat(output, number);
    		strcat(output, ".txt");
    		ofstream out(output);
    		string input;
    

    Das Array `radinfile[diff]` ist allerdings viel zu gross, wenn ich eine Angabe von mehreren Monaten angebe. Ich glaube, ich könnte den Speicherplatz erhöhen (wenn ja, weiss ich nicht wie) und somit auch das Array.

    Lieber wäre mir jedoch das Einlesen der Dateien anhand einer .txt-Datei der vorhandenen Uhrzeiten , die ich seit Kurzem habe.
    So sieht sie aus:

    1991 11 12 06 48
    1991 11 12 06 53
    1991 11 12 07 02
    1991 11 12 06 11
    usw.

    Ich habe versucht die Datei einzulesen (funktioniert auch) und alle Elemente mit strcat anzuhängen. Dies klappt jedoch nur, wenn ich max. 4 mal strcat benutze, vielleicht weil dadurch der string zu lange wird. Ich weiss es nicht.

    FILE	*fi,*fi1;
    
    	fi = fopen ("Uhrzeiten.txt", "r");
    	filenumb = 19854;
    
    	for (i=0 ; i<filenumb; i++)
    	{
    		fscanf (fi, "%d %d %d %d %d", &year,&month,&day,&hour,&min);
    		fscanf(fi,"\n");
    
    		date = month*100 + day;
    		time = hour*100 + min;
    
    	      char* radinfile[filenumb];
    		char path[80] = "d:\\...\\";
    
    		ostringstream buf1;
    		buf1 << year;
    		string num1 = buf1.str();
    		const char* year1 = num1.c_str();
    		strcat(path, year1);
    
    		ostringstream buf2;
    		buf2 << date;
    		string num2 = buf2.str();
    		const char* date1 = num2.c_str();
    		if (date < 1000)
    		    { strcat(time, "0");}
    		strcat(path, date1);
    
    		ostringstream buf3;
    		buf3 << time;
    		string num3 = buf3.str();
    		const char* time1 = num3.c_str();
    		if (time < 1000)
    		    { strcat(path, "0");}
    		strcat(path, time1);
    
    		strcat(path, ".txt");
    
                radinfile[i] = path;
    
    		char output[80] = "d:\\Chris\\Programs\\test_data\\";
    		....
    

    Da ich mich mit den ganzen Befehlen nicht ganz so gut auskenne, habe ich einfach die Anordnung vom ersten Programm abgeändert. Wenn ich irgendein strcat ausklammer, funktioniert es, ebenso bei if-Anweisungen von z.B. month < 1000000.
    Warum, weiss ich nicht.

    Ich bin für jede Hilfe dankbar, die dieses Problem löst, oder auch die eingelesenen Zahlen einfacher in meinen Pfad einfügt.

    Danke schon mal im voraus, und ich hoffe ich habe keine wichtigen Angaben vergessen (der post is eh schon lange genug).

    Mfg
    Christian



  • Was soll denn das Gegurke mit den char*'s? Wir sind hier in C++ und da nimmt man durchgängig Strings. (und statt des strcat kannst du += verwenden, um die einzelnen Strings aneinanderzuhängen)



  • Wie gesagt, ich kenn mich leider nicht gut damit aus und habe es deshalb so aus einem anderen Programm übernommen und abgeändert. Dadurch ist es auch kompliziert und lange geworden.

    Wie ich es allerdings nur mit strings bearbeiten kann, weiss ich nicht.

    Trotzdem Danke für die fixe Antwort.
    Christian



  • Mal als Ansatz eine Variation deines oberen Quelltextes:

    const int anfang = 11120847;   //Anfang und ende in mmddhhmm, Jahreszahl in der path-Angabe
    const int ende = 11221036;  
    const int diff = ende - anfang + 1;
    
    string radinfile[diff];
    
    for (int r = anfang; r <= ende; r++)
    { 
      string path = "d:\\...\\1991";
    
      ostringstream buf;
      buf << r;
      /*
        string num = buf.str();
        const char* number = num.c_str();
        strcat(path, number);
        strcat(path, ".txt");
      */
      path+=buf.str()+".txt";
      radinfile[r-anfang] = path;
    
      string output = path;//Frage: Wieso brauchst du hier zwei Variablen mit dem selben Inhalt?
    
      ifstream in;		
      in.open(radinfile[r-anfang].c_str());
    
      if (in != NULL)    //Kontrolle, ob vorhandene Nummer auch als datei existiert
      { 
        ofstream out(output.c_str());
        string input;	
        ...
      }
    

    (PS: Und scroll mal etwas nach unten - im Magazin findest du einen Artikel zum Thema Stringverarbeitung)



  • Danke erstmal für die Vereinfachung!!

    Ich hoffe mal, dass ich deine Form auch auf die zweite Variante anwenden kann (da ja im obigen Bsp. der Array zu gross wurde).
    Zu deiner Frage: Die zweite Variable ist fürs Schreiben neuer veränderter Dateien in einen anderen Ordner.
    Und dein PS werde ich mir auch zu Gemüte führen

    Danke 👍
    Chris



  • Ja, du kannst statt des Arrays auch einen vector<string> verwenden - der wächst mit (solange du noch etwas RAM übrig hast).


Log in to reply