C++ Probleme mit String

roschm

Newbie
Registriert
Juni 2010
Beiträge
6
Hallo!

Ich bin nicht gerade der C++ Experte und fand deshalb keine Lösung für mein Problem! Denn ich möchte eine kleine Konsolenanwendung basteln. Just for Fun. Das ganze soll per Barcode Artikel in eine Liste einfügen. Funzt alles prima. Nun hab ich auch eine Funktion zum Speichern in Textdateien gemacht. Funktioniert auch, aber nicht perfekt! Ich will nämlich, dass man keinen Namen eingeben muss, also für die Datei, klappt auch, aber nicht so wie ich es will! Denn ich möchte, dass die Datei z.B. heißt: artikelliste*Nummer der Artikelliste(Sprich 1, später 2 und dann halt 3^^)*.txt. Ich scheitere bei der Nummer! Hier mal ein Teil des Codes:
Code:
int nr = 0;
string nrstring = nr;
string endung = ".txt";
string dateiname;

//Weitere Teile des Codes bis zum Speichern:

nr++
dateiname = "artikelliste" + nrstring + endung;

//Code zum speichern. Variable "dateiname" als Dateiname^^

//Weiterer uninterressanter Code

Dann speicherts die Datei garnicht ab! Als ich dann probiert hab einfach antstatt des "nrstring" einfach den int-Wert benutzt hab, hat es beim Namen immer die entsprechende Anzahl an BUchstaben vorne weggenommen! Ich hab dann mal "nrstring" per cout ausgegeben, hat dann wenn nr = 1 war ein ☺ ausgegeben. Hat jemand ne Lösung? Würde mich freuen!

PS: Wenn jemand weiß wie man in C++ ne TExtdatei druckt wär auch cool!

Gruß
roschm
 
Ich kenn mich mit der string-Klasse der Standardbibliothek nicht gut aus. Aber ich glaube, dass diese Zuweisung:
Code:
string nrstring = nr;
nicht korrekt ist. Siehe hier:
http://www.cplusplus.com/reference/string/string/operator=/

Der Seite nach zu urteilen ist der Zuweisungsoperator für int nicht definiert. Demnach wird das Argument in ein char gecastet. Deswegen wird die 0 als ASCII-Wert interpretiert und solch ein Zeichen statt einer Zahl ausgegeben.

Möglicher Workaround: Setze mal nr am Anfang auf 48 statt auf 0, und schau ob's dann funktioniert.
 
Zuletzt bearbeitet:
#include <sstream>

...

ostringstream oss;
oss << "artikelliste" << nr<< endung
dateiname = oss.str();
 
Zuletzt bearbeitet:
der smiley bei der 1 ist weil der wert 1 im datentyp string (char) als ascci-wert 1 gesehen wird. uim eine 1 auszugebe musst du denascii-wertder "1" bekmmen. der ist glaube ich 44! einfach mal in gogle gucken, such anch Asciitabelle.
 
außerdem wird ja nur die variable nr inkrementiert und in nrstring wird vorher einmal nr reingeschrieben bleibt also die ganze Zeit 0.
vielleicht geht auch folgendes? (glaub aber 1668mib Lösung ist die beste...


int nr = 0;
string nrstring;
string endung = ".txt";
string dateiname;

//Weitere Teile des Codes bis zum Speichern:

nr++
nrstring = nr.toString();
dateiname = "artikelliste" + nrstring + endung;

//Code zum speichern. Variable "dateiname" als Dateiname^^

//Weiterer uninterressanter Code
 
@GrooveXT: Warum so typunsichere Sachen nehmen, außerdem meinst du sprintf und nicht printf...

@Manule: nein, geht nicht, int ist bei C++ ein nativer Datentyp und keine Klasse.

@Der Alu: Deine Begründung, warum es nicht geht, ist im Übrigen Quatsch. Hätte String einen Konstruktor für int, würde es problemlos mit der Zuweisung gehen, auch wenn operator= nicht für int implementiert ist.

Hier wird aber das int aber einfach auf char gecastet...
 
Zuletzt bearbeitet:
Da 1668mib Dir ja schon gezeigt hat, wie man mit ostringstream was in string-Objekte schreiben kann, brauch ich Dir nur noch zeigen, wie man in C++ Dateien schreibt.


Code:
#include <fstream>
#include <iostream>

int main()
{
	std::ofstream out( "irgendeinDateiName.txt" );

	if ( ! out )
	{
		std::cerr << "Konnte Datei nicht öffnen!\n";
		return 1;
	}
	
	// Jetzt was in die Datei schreiben.
	const int eineZahl = 34535;
	out << "bla bla bla ... Wert der Zahl = " << eineZahl << std::endl;
	
	
	// Datei schließen. Ist hier optional, da der Destruktor von "out" das sowieso macht.
	out.close();
	
	return 0;
}

Ist jetzt nur schnell aus dem FF zusammengeschrieben ... hab nicht überprüft, ob das kompiliert; sollte aber eigentlich schon. :)
 
Zurück
Oben