# [c++] wie mit ofstream out einen int wert als dateinamen einfügen?



## c-mule (1. November 2008)

Hi,

wie kann ich den Wert einer int Variablen als Dateinamen verwenden?

Beispiel:

int dateinummer;
string eingabe;
dateinummer=10;
getline (cin, eingabe);

ofstream out (?); //hier sollte die Variable dateinummer stehen, die Dateinamen sollen dann z.B. 10.txt, 11.txt, 12.txt heißen, der Inhalt der Datei soll Text sein.

out<<eingabe<<endl;

Vielen Dank für eure Hilfe


----------



## SGSSGene (1. November 2008)

Mit sprintf kannst du so was machen:

```
char dateiname[256];
sprintf(dateiname,"%i",dateinummer);
```
in [dateiname] steht nun der Wert von [dateinummer] Als String, diese Variante erlaubt es dir auch sehr einfach noch was davor zu setzten oder ein anhängsel zu Dateinummer: z.B:

```
sprintf(dateiname,"text_%i.txt",dateinummer);
```

mfg
SGSSGene

Edit: siehe unten deepthorat C++ Lösung


----------



## deepthroat (1. November 2008)

Hi.

In C++ (im Gegensatz zu C) würde das so aussehen:

```
#include <sstream>

ostringstream filename;

filename << dateinummer << ".txt";
ofstream out(filename.str().c_str());
```
Gruß


----------



## c-mule (1. November 2008)

Vielen Dank für eure Antworten,

die Lösung von dir, deepthroat, konnte ich gut in meine Quellcode integrieren, dabei tun sich aber neue Fragen auf:

1.  Wie kriege ich es nun hin, daß ich die Dateien in verschiedenen Ordnern speichern kann, z.B. d:\\Ordner1\\Ordner2 ?

So , wie ich es bisher getan habe: 

ofstream out("d:\\Ordner1\\Ordner2\\text.txt");

geht es leidern nicht mehr.

2. Wo kann ich mehr über #include <sstream> erfahren?

Viele Grüße


----------



## deepthroat (1. November 2008)

Hi.





c-mule hat gesagt.:


> 1.  Wie kriege ich es nun hin, daß ich die Dateien in verschiedenen Ordnern speichern kann, z.B. d:\\Ordner1\\Ordner2 ?
> 
> So , wie ich es bisher getan habe:
> 
> ...


Du müßtest die Ordner dann auch mit zum Stream geben. Z.B.

```
filename << "d:\\" << "Ordner" << ordnerNr1 << '\\' << "Ordner" << ordnerNr2;
```



c-mule hat gesagt.:


> 2. Wo kann ich mehr über #include <sstream> erfahren?


In jedem *guten* C++ Buch oder in jeder *guten* Onlinereferenz: http://www.cplusplus.com/reference/iostream/

Gruß


----------



## c-mule (2. November 2008)

Super deepthroat

Das funktioniert prima. Mit dem Rückweg, also die Dateinamen aus den Ordnern auszulesen und in int Werte umzuwandeln scheint aber anders zu funktionieren?

Alle meine Versuche sind bisher gescheitert. Ich benötige die Zahlenwerte der Dateinamen, um sie anschließend weiter zu verarbeiten.

Wie krieg ich da hin?


----------



## deepthroat (2. November 2008)

c-mule hat gesagt.:


> Das funktioniert prima. Mit dem Rückweg, also die Dateinamen aus den Ordnern auszulesen und in int Werte umzuwandeln scheint aber anders zu funktionieren?
> 
> Alle meine Versuche sind bisher gescheitert. Ich benötige die Zahlenwerte der Dateinamen, um sie anschließend weiter zu verarbeiten.
> 
> Wie krieg ich da hin?


Da mußt du die Dateinamen dann parsen. (Ich nehme mal an ausgelesen hast du die Dateinamen schon).
Für die Dateinamen könntest du es so machen:

```
istringstream filename("12.txt");
int nr;
if (filename >> nr) {
  cout << "Dateinummer: " << nr << endl;
} else {
  cerr << "keine Dateinummer vorhanden." << endl;
}
```
Gruß


----------



## c-mule (2. November 2008)

Hallo,

ich habe es so probiert:

istringstream filename("d:\\Ordner-1\\Ordnder-2\\Ordnder-3\\1.txt");

Dabei bekomme ich aber eine Fehlermeldung:

invalid operands of types `const char[36]' and `int' to binary `operator>>' 

Das ist auch noch nicht ganz das, was ich wirklich benötige.

So soll es sein:
Das Programm soll z.B. Datei 1.txt lesen, danach soll die Dateinummer um 1 erhöht werden, um eine Datei 2.txt zu schreiben. Nun soll der Prozess von vorne laufen:
Datei 2.txt lesen, Dateinummer um eins erhöht, Datei 3.txt schreiben usw.

Danke und viele Grüße


----------



## deepthroat (2. November 2008)

c-mule hat gesagt.:


> Hallo,
> 
> ich habe es so probiert:
> 
> ...


Das kann nicht sein. In dieser Zeile hast du ja überhaupt keinen >> Operator verwendet. Wie soll dann diese Fehlermeldung zustande kommen?! 


c-mule hat gesagt.:


> Das ist auch noch nicht ganz das, was ich wirklich benötige.
> 
> So soll es sein:
> Das Programm soll z.B. Datei 1.txt lesen, danach soll die Dateinummer um 1 erhöht werden, um eine Datei 2.txt zu schreiben. Nun soll der Prozess von vorne laufen:
> Datei 2.txt lesen, Dateinummer um eins erhöht, Datei 3.txt schreiben usw.


Dann merk dir doch einfach die Dateinummer zwischen den Aufrufen. Oder meinst du zwischen verschiedenen Aufrufen des Programmes? 

Gruß


----------



## c-mule (2. November 2008)

Ups, sorry, diese Fehlermeldung kam bei dem Versuch:

istringstream filename("d:\\Ordner-1\\Ordnder-2\\Ordnder-3\\>>nr>>.txt");

so:

int nr;
istringstream filename("d:\\Ordner-1\\Ordner-2\\Ordner-3\\11.txt");
if (filename >> nr) {
cout << "Dateinummer: " << nr << endl;
}
else {
cerr << "keine Dateinummer vorhanden." << endl;
}

hat es aber auch nicht funktioniert, obwohl sich die Datei 11.txt im angegebenen Ordner befindet.

einfacher wäre vielleicht auch, vor dem nächsten speichern festzustellen, welche die letzte gespeicherte Dateinummer ist.

Wie kann ich aber in deinem letzten Vorschlag die Dateinummer, z.B. 12.txt flexibel handhaben, so daß ich bei Bedarf eine andere Nummer einfügen kann?

Gruß


----------



## deepthroat (2. November 2008)

c-mute hat gesagt.:
			
		

> so:
> 
> 
> ```
> ...


So kann es nicht funktionieren. Es ist auch völlig egal ob die Datei dort existiert oder nicht. Diese Methode funktioniert nur mit Dateinamen, die mit einer Zahl anfangen. Wenn der Dateiname bzw. in dem Fall der Pfad den du eingegeben hast nicht mit einer Ziffer beginnt funktioniert es nicht. 

Ich glaube langsam du hast die Dateien noch gar nicht aus dem Ordner gelesen. Du mußt doch erstmal feststellen welche Dateien es überhaupt in den entsprechenden Ordnern gibt bevor du die Namen der Dateien auseinander nehmen kannst.... Das müßtest du unter Windows mit FindFirstFile und FindNextFile machen.

Gruß

PS: Bitte verwende die Code-Tags wenn du Quelltext in deinem Beitrag angibst.


----------



## c-mule (6. November 2008)

FindFirstFile und FindNextFile sind glaube ich aus API, oder? 

Macht aber nichts, denn ich habe die Lösung gefunden. Hier nochmal für alle die es interessiert:


```
string einlesen;
int dateinummer;
dateinummer=11;
std::stringstream filename;
filename <<"d:\\Ordner-1\\Ordener-2\\Ordner-3\\" << dateinummer << ".txt";

ifstream meinedatei;
meinedatei.open(filename.str().c_str(), ios::in);
while(meinedatei >> einlesen)
{
cout<<"eingelesene Datei Nr.  "<< dateinummer <<" mit dem Inhalt:  " << einlesen << endl;
```

Funktioniert prima. Vielen Dank deepthroat !
Gruß


----------



## deepthroat (6. November 2008)

c-mule hat gesagt.:


> FindFirstFile und FindNextFile sind glaube ich aus API, oder?


Ja, aus der WinAPI. Dateisystemfunktionen sind betriebssystemspezifisch und gehören deshalb nicht zu C++.


c-mule hat gesagt.:


> Macht aber nichts, denn ich habe die Lösung gefunden. Hier nochmal für alle die es interessiert:
> 
> 
> ```
> ...


Das ist doch aber nun was ganz anderes als du gefragt hattest. Oder ich hab dich irgendwie nicht richtig verstanden. Aber wolltest du nicht eigentlich die Dateinummer aus dem Dateinamen ermitteln?

Gruß


----------



## devDevil (6. November 2008)

Du weißt aber scon das Objekte Konstruktoren haben?! (c-mule)
Ehm und Dateisystemoperationen sind mein ich doch in TR2 enthalten, oder? Andernfalls einfach hier auf boost.org zurück greifen ...


----------

