Loop für sprintf_s



  • Hallo,

    ich habe in Sierra Chart (Chartsoftware) einen Code geschrieben. der mir die Einzelnen gehandelten Volume pro Preis ausgibt und in einer Textdatei abspeichert. Die Text Datei importiere ich in Excel und kann hier mein eigenes Volumenprofil erstellen. Das Funktioniert auch alles Reibungslos.

    Mein Problem ist die Ausgabe in eine Datei. Bis jetzt muss ich für jedes i meiner Schleife einen zugeordneten sprintf_s Befehl mit zugehöriger Formatierung erstellen. Problem ist, dass i immer sehr unterschiedlich ist und auch sehr hoch werden kann.

    Bin offen für jede Lösung. Könnte man die if-Anweisung z.B. in einen Loop packen?? Ich will einfach das Problem umgehen 100 und mehr else if Schleifen für unterschiedliche Formatierungen zu erstellen.

    Danke für eure Hilfe!

    MFG Thomas

    {
    		
    		SCString msg;
    		
    		char buffer[256];
    
    		int i;
    
    		int V = sc.VolumeAtPriceForBars->GetSizeAtBarIndex(sc.Index);
    						
    		std::vector<int> numbers(V);
    						
    		s_VolumeAtPriceV2* p_VAP;
    												
    		for (i = 0; i < numbers.size(); i++)
    
    		{
    			sc.VolumeAtPriceForBars->GetVAPElementAtIndex(sc.Index, i, &p_VAP);
    
    			numbers[i] = p_VAP->Volume;
    									
    			if (i == 0)
    			{
    				msg.Format("%d", numbers[0]);
    				sprintf_s(buffer, 256, "%d", numbers[0]);
    			}
    			else if (i == 1)
    			{
    				msg.Format("%d %d" , numbers[0], numbers[1]);
    				sprintf_s(buffer, 256, "%d %d", numbers[0], numbers[1]);
    			}
    			else if (i == 2)
    			{
    				msg.Format("%d %d %d", numbers[0], numbers[1], numbers[2]);
    				sprintf_s(buffer, 256, "%d %d %d", numbers[0], numbers[1], numbers[2]);
    			}
    			else if (i == 3)
    			{
    				msg.Format("%d %d %d %d", numbers[0], numbers[1], numbers[2], numbers[3]);
    				sprintf_s(buffer, 256, "%d %d %d %d", numbers[0], numbers[1], numbers[2], numbers[3]);
    			}
    			
    			sc.AddMessageToLog(msg, 1);
    
    			FILE* out = fopen("text.txt", "w");
    
    			fwrite(buffer, sizeof(char), strlen(buffer), out);
    
    			fclose(out);
    		
    		}
    
    }


  • Mach das sprintf_s weg, und dann:

    msg.Format("%d", numbers[0]);
    for (int j = 0; j < i; j++) {
        msg.AppendFormat(" %d", numbers[j + 1]);
    }
    
    // ...
    
    fwrite(msg.GetChars(), sizeof(char), msg.GetLength(), out);
    


  • Hast du schon mal über deinen Code nachgedacht?
    Du überschreibst bei jedem Schleifendurchgang jedesmal wieder neu die Text-Datei.

    Es geht viel einfacher:

    // Pseudo-Code
    
    Datei öffnen
    Loop über alle Werte
        Schreibe den i. Wert in die Datei (mit Leerzeichen vorweg/danach)
    Datei schließen
    


  • @hustbaer @Th69

    Hallo,
    vielen Dank für Eure schnellen Antworten!😃 Werde ich heute noch versuchen und dann berichten.

    MFG Thomas