sprintf um "link zu erstellen"



  • Stichwort: std::stringstream

    std::stringstream s;
    s << TileGroup;
    sTG = s.str();
    


  • Aja du willst also einen std::string in einen char* casten lassen? na dann 😛 Das geht nicht!

    std::vector<char> char_arr_tilegroup(std::numeric_limits<int>::digits() + 1); // 1 für Terminierungszeichen
    std::sprintf(&char_arr_tilegroup[0], "%d", TileGroup);
    std::string string_tilegroup = char_arr_tilegroup;
    

    ... aber das ist nen bissel rumgefummelt 😛 Also solltest schon std::ostringstream nutzen ...

    std::ostringstream ss;
    ss << TileGroup;
    std::string string_tilegroup(ss.str());
    

    ...



  • ah cool danke für die hilfe, werd mir das heute noch anschauen, wenn's probleme gibt, sag ichs nochmal



  • (D)Evil schrieb:

    Aja du willst also einen std::string in einen char* casten lassen? na dann 😛 Das geht nicht!

    Was ist mit std::string::c_str(); ?



  • Storm.Xapek.de schrieb:

    (D)Evil schrieb:

    Aja du willst also einen std::string in einen char* casten lassen? na dann 😛 Das geht nicht!

    Was ist mit std::string::c_str(); ?

    Das wäre dann ein const char*.

    Um den zu verändern müsstest du das const wegcasten, aber das kann sehr schnell ins Auge gehen.



  • Ehm ja unteranderem weil std::string die Größe des Strings als Membervariable hat ... und die veränderst du ja so unter Umständen 😛 Also von daher sollte man das lassen ... sonnst natürlich:

    std::string tmp;
    char* tmp_c(const_cast<char*>(tmp.c_str()));
    

  • Mod

    The-Kenny schrieb:

    Um den zu verändern müsstest du das const wegcasten, aber das kann sehr schnell ins Auge gehen.

    Auch mit dem Nachsatz bleibt es falsch.



  • Danke! Das hat jetzt geklappt.

    Gut ich habe das mit dem sstream geschafft!

    Als nächstens möchte ich mir diese ganzen Links - und das ist erstmal mein Ziel - in eine .txt-Datei schreiben.

    Ich arbeite hier natürlich mit <fsream>, eh klar.

    Das ist jetzt ja ein Downloadmanager, sprich ich muss jetzt die ganzen Zahlen durchgehen:

    Spalte 1 Zeile 1
    Spalte 1 Zeile 2
    Spalte 1 Zeile 3
    Spalte 2 Zeile 1
    Spalte 2 Zeile 2
    Spalte 2 Zeile 3
    ...
    

    Muss ich jetzt bei jedem Schleifendurchlauf mit dem sstream die Zeile/Spalte umwandeln und dann in die .txt schreiben?

    Mein Problem wird glaub ich sein, wenn ich nach jedem Schleifendurchlauf was zum sstream einfügen will, hängt sich das an, anstatt zu überschreiben:

    std::stringstream a;
    a << TileGroup;
    sTG = a.str();
    

    Dann wird beim 5. Schleifendurchlauf 12345 anstatt 5 drinnenstehen...
    Muss ich zum schluss a=""; zuweisen, oder soll ich gleich irgendeinen anderen Weg verfolgen?



  • Da müsstest du zwischendurch den Stream wieder entleeren - mit a.str(""); . (oder du packst den Stringstream lokal in die Schleife, dann wird er bei jedem Durchlauf neu (leer) angelegt)



  • so, bin jetzt um einiges weiter, hab das jetzt mal auf die Schnelle programmiert, hab jetzt aber 2 kleine Probleme: beim schreiben kann ich das ja nicht binary machen, weil man muss es ja lesen können, und 2. hab ich einen Kompilierfehler, hier mal der wichtige Codeteil:

    ofstream schreiben;
    
    		for(int i=0; i<maxSpalte; i++)
    		{
    			a << Spalte;
    			sS = a.str();
    
    			for(int j=0; j<maxZeile; j++)
    			{
    			a.str("");
    			a << Zeile;
    			sZ = a.str();
    			a.str("");
    
    			fertigerlink = fertigerlink = link + "/TileGroup" + sTG + "/" + sZS + "-" + sS + "-" + sZ;
    
    				schreiben.open("Links.txt", ios::binary|ios::out|ios::app);
    				if(!schreiben)
    				{
    			cout << "Die Datei konnte nicht geöffnet werden! \n";
    				}
    				else
    				{	
    			schreiben.write(fertigerlink, sizeof(fertigerlink));
    			schreiben.close();
    			schreiben.clear();
    				}
    			}
    		}
    

    Kompilierfehler:

    'std::basic_ostream<_Elem,_Traits>::write': Konvertierung des Parameters 1 von 'std::string' in 'const char *' nicht möglich
    


  • Warum willst du eigtl. binary_mode haben?

    template<typename T>
    void write_string_binary(std::basic_string<T> const& str, std::basic_ostream<T>& out)
    {
        const std::size_t size(str.size() + 1);
        out.write(reinterpret_cast<const char*>(&size), sizeof(std::size_t));
        out.write(str.c_str(), sizeof(T) * size);
    }
    
    int main()
    {
        std::ofstream file_stream("links.dat", std::ios::binary);
        if (!file_stream) { std::cerr << "FEHLER: Datei konnte nicht geöffnet werden!" << std::endl; return false; }
        write_string_binary<char>("Das ist mein String", file_stream);
    }
    

    ...

    const std::size_t size


Anmelden zum Antworten