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! 🙂


  • Mod

    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.


  • Mod

    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! 🙂


Anmelden zum Antworten