sprintf um "link zu erstellen"
-
Hi. Ich programmiere die Grundlage eines Downloadmanagers, dabei brauche ich, um die eingegebenen Zahlen in den fertigen Link (string) umzuwandeln sprintf!
Folgender Code:
int TileGroup, ZoomStufe, Spalte, Zeile; //werden eingelesen string sTG, sZS, sS, sZ; //sind die Zahlen in String umgewandelt // Hier kommt der Teil der unnötig für das Problem ist... //....... //und hier die Umwandlung sprintf( sTG, "%d", TileGroup ); cout << sTG; //Ausgegeben wird der String noch richtig, allerdings hab ich danach ein Stack //Problem. Und beim Kompilieren bekomm ich auch: //error C2664: 'sprintf': Konvertierung des Parameters 1 von 'std::string' in //'char *' nicht möglichIch glaube der Fehler ist nicht groß, kann mir jemand helfen?
mfg XaTrIxX
-
sprintf ist eine C-Funktion für char-Arrays.
Benutzte stattdessen Stringstreams.
http://www.cppreference.com/cppsstream/all.html
-
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()));
-
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