Variable in String einfügen?
-
Hallo!
Ich habe in meinem Programm eine switch Anweisung, und je nach Fall soll eine Datei mittels
fstream f; f.open("interpolation_b_.dat", ios::out); . . .
ausgegeben werden.
Kann ich in den Dateinamen irgendwie eine Variable einbauen, die mir - je nach switch case - einen anderen Dateinamen festlegt?Danke schonmal vorab für Eure Hilfe!
-
Ja.
Für konkrete Antworten musst du aber eine konkrete Frage stellen.
-
Hallo Sepp!
Danke für die schnelle Antwort.
Sorry, wenn's zu vage war:
Ich möchte konkret meine char-Variable, die ich auch als switch-Parameter habe, in den Dateinamen mit einbauen, und weiß nicht, wie das geht.
Ein weiteres Problem, das nichts damit zu tun hat, is aber aufgetaucht:
Nachdem ich fstream f; aufrufe, werden von meinem Compiler keine case-labels mehr akzeptiert ("error: jump to case label") - das weiß ich leider nicht zu interpretieren
-
Tonikum schrieb:
wenn's zu vage war:
Zeige Code. Wir können derzeit mangels Angaben nur raten.
-
Kommt halt auf den genauen Fall an, die übliche Vorgehensweise ist, sich ein std::string oder std::stringstream Objekt zu konstruieren und dieses dann als Dateinamen zu verwenden. Ein paar Beispiele:
Harmlose Aneinanderreihung von Zeichen(ketten)
char foo='f'; std::string dateiname=std::string("Anfang_") + foo + ".txt"; std::ifstream file(dateiname.c_str()); // Anfang_f.txt
Oder ohne temporäre Variable:
char foo='f'; std::ifstream file((std::string("Anfang_") + foo + ".txt").c_str()); // Anfang_f.txt
Man kann natürlich auch die std::string Funktionen benutzen, wenn es einem passt:
char foo='f'; std::string dateiname="Anfang_X.txt"; dateiname.replace(7,1,1,foo); ifstream file(dateiname.c_str()); // Anfang_f.txt
Oder vielleicht hat man ja auch mal was komplizierteres, was man Zusammensetzen will:
char zeichen='f'; double zahl=1.05; int andere_zahl=16; std::stringstream dateiname; dateiname << "Anfang_" << zeichen << "_" << zahl << std::hex << "_" << andere_zahl << ".txt"; ifstream file(dateiname.str().c_str()); // Anfang_f_1.05_10.txt
Oder (da du schreibst, dass der dateiname vom switch abhängt) eventuell auch so:
switch(foo){ case 'A': case 'a': dateiname = "Dateiname_A"; break; case 'B': case 'b': dateiname = "Dateiname_B"; break; } Oder eine beliebige Kombination aus den gezeigten Möglichkeiten.
-
Ohwei, ich glaube, ich habe in ein Wespennest gestochen.
Ich bin ja der ewige Noob hier - dass man mit dateinamen soviel verkehrt machen kann, wusste ich nicht. ^^ich poste mal meinen ganzen Code, weil ich noch eine Frage hab :):
#include <iostream> #include <fstream> using namespace std; double* Speicher_fuer_Vektor_anlegen(int dim); double auswertung(double * stuetz, double * baryz, double * werte, double x, int n); double * skalierung(double links, double rechts, int m); double * baryz_koo(double * stuetz, int n); double runge( double x ); int main() { char choice; double * stuetz, * werte, * baryz, *skal, P; int n, i; do { cout << "Aufgabenteil a, b der c? Ende mit e. "; cin >> choice; switch(choice) { /* ------------- Aufgabenteil a) ------------- */ case 'a': n = 11; stuetz = Speicher_fuer_Vektor_anlegen(10+1); for(i=0; i<=10; i++) stuetz[i] = double(i)/10.0; werte = Speicher_fuer_Vektor_anlegen(10+1); werte[0] = 1.0 ; werte[1] = 0.989; werte[2] = 0.959; werte[3] = 0.9002; werte[4] = 0.8101; werte[5] = 0.691; werte[6] = 0.5491; werte[7] = 0.395; werte[8] = 0.243; werte[9] = 0.1098; werte[10] = 0.0; skal = skalierung(0.0, 1.0, 1000); baryz = baryz_koo(stuetz, 10); fstream f; f.open("interpolation_a.dat", ios::out); for(i=0; i<=1000; i++) { P = auswertung(stuetz,baryz,werte,skal[i],10); f << skal[i] << "\t" << P << endl; } f.close(); cout << "Interpolation berechnet. (siehe Ordner)" << endl; break; /* ------------- Aufgabenteil b) ------------- */ case 'b': int grad; cout << "Grad?: "; cin >> grad; stuetz = skalierung(-5.0, 5.0, grad); skal = skalierung(-5.0, 5.0, 1000); werte = Speicher_fuer_Vektor_anlegen(grad + 1); for(i=0; i <=grad; i++) werte[i] = runge(stuetz[i]); baryz = baryz_koo(stuetz, grad); f.open("interpolation_b.dat", ios::out); for(i=0; i<=1000; i++) { P = auswertung(stuetz,baryz,werte,skal[i],grad); f << skal[i] << "\t" << P << endl; } f.close(); cout << "Interpolation berechnet. (siehe Ordner)" << endl; } }while(choice != 'e'); return 0; } double runge( double x ) { return 1.0 / (1.0 + 5.0 * x*x); } double * baryz_koo(double * stuetz, int n) // Vektor hat n+1 Komponenten! { double * baryz = Speicher_fuer_Vektor_anlegen(n+1); for(int i = 0; i <= n; i++) { baryz[i] = 1; for(int j = 0; j <= n; j++) if(j!=i) baryz[i] = baryz[i]/(stuetz[i] - stuetz[j]); } return baryz; } double auswertung(double * stuetz, double * baryz, double * werte, double x, int n) { double l = 1.0, s = 0.0; double y; for(int i = 0; i <= n; i++) { y = x - stuetz[i]; if( y == 0) { return werte[i]; } l = l * y; s = s + baryz[i]*werte[i]/y; } return l*s; } double * skalierung(double links, double rechts, int m) // Teilt Intervall in m + 1 äquidistante Stücke { double * skal = Speicher_fuer_Vektor_anlegen(m+1); for(int i = 0; i <= m; i++) skal[i] = links + (double(i)/double(m))*rechts; return skal; } double* Speicher_fuer_Vektor_anlegen(int dim) { double* v; v=(double *)(calloc(dim,sizeof (double))); if (v==NULL) { cout << "Nicht genuegend Speicher vorhanden!"; exit(-1); } return v; }
Ist noch in Bearbeitung. Bei Zeile 58 brauche ich dann die Variable im Dateinamen. Geht das nicht einfacher, als beschrieben? *hust*
Ich kenn mich doch sowieso schon kaum aus ^^"
Wenn nicht, dann danke für die Mühe!Meine zweite Frage bezieht sich auf den bereits erähnten Fehler beim "case 'b'" (Zeile 71), wo men Compiler "error: jump to case label" meldet.
Mit ist aufgefallen, dass der Fehler eintrit, sobald der zweite "case" nach dem dem "fstream f;" steht. Weiß das jemand zu deuten?Dankeschön!