365 Dateien in FilenameYearMonthDay.nc format in eine schleife lesen



  • Liebe Forum Freunde,
    ich versuche in eine Verzeichniss liegende 365 Dateien zu öffnen und einzulesen.
    Ich bin leider keiner erfahrene C++ Programmierer.
    mit Fortran 90/95 werde ich die Lösung einfach

    st1="Filename"
    ya="Year"
    mm="Month"
    dd="Day"
    st2=".nc"
    nf90_open(trim(st1)//trim(ya)//trim(mm)//trim(dd)//trim(st2),nf90_nowrite)
    

    wie kann ich so eine trim() funktion in c++ verwenden?

    ich danke allen für die Hilfe im Voraus.



  • Gibts in C++ so nicht, brauchts in C++ so nicht:

    int main()
    {
      std::string a = "Meh";
      std::string b = "Muh";
      std::cout << a+b << '\n; //MehMuh
    }
    


  • Ehrlich gesagt, weiß ich nicht wie ich das mit std::string::substr() lösen kann.

    mir gehts darum

    for (yr=2005;yr<2010;yr++){
       for (month=0;month<12;month++){
         for (day=0;day<365;day++){
            nc_open("Filename"//"yr"//"month"//"day"//".nc",NC_NOWRITE)
         }
       }
    }
    

    so in drei schleifen die Dateien für jeden Tag zu öffnen



  • vielen Dank @Pamuckl.

    es sieht so aus, dass es für meine Lösung dienen kann.

    #include <iostream>                             // Standardstream-Funktionaliät einbinden
    #include <fstream>                              // ofstream und ifstream einbinden
    
    using namespace std;
    
    int main(void) {
      int yr,month,day;
      ifstream Quelldatei;                          // neuen Lese-Stream erzeugen
      std::string DN = "Filename";
      std::string NC = ".nc";
      for (yr=2005;yr<2010;yr++){
        std::string year="yr";
        for (month=0;month<12;month++){
          std::string mon = "month";
          for (day=0;day<365;day++){
            std::string dd = "day";
            std::string dname = DN+year+mon+dd+NC;
            Quelldatei.open("dname", ios_base::in); // Datei öffnen
            std::cout << dname << '\n';
          }
        }
      }
    }
    

    so kriege ich als output nur:
    Filenameyrmonthday.nc



  • Nein, da du erstens die Datei namens "dname" öffnest und zweitens noch gar nichts ausliest... Außerdem hast du die Zählvariablen nirgendwo deklariert, du versuchst sie einfach so zu initialisieren und hoffst, dass sich der Compiler einen Typ dazu denkt 😉

    Wenn du wissen willst, ob es funktioniert warum probierst du es net einfach aus?

    Edit:

    so kriege ich als output nur:
    Filenameyrmonthday.nc

    Und was wundert dich daran, dass dein Programm das ausgibt was im string gespeichert ist, wenn du ihn nach cout "verschiebst"?

    Eigne dir doch bitte die Grundlagen zu C++ an, denn wie du vielleicht langsam bemerkst, hat es wenig mit Fortran gemein...



  • Damit habe ich die Sache gelöst.

    #include <iostream>                             // Standardstream-Funktionaliät einbinden
    #include <fstream>                              // ofstream und ifstream einbinden
    #include <sstream> 
    #include <string>
    using namespace std;
    template <typename T>
    std::string number_to_string(T number)
    {
          return dynamic_cast<std::stringstream *> (&(std::stringstream() << number))->str();
    }
    
    int main() {
      int yr,month,day;
      ifstream Quelldatei;                          // neuen Lese-Stream erzeugen
      std::string DN = "Filename";
      std::string NC = ".nc";
      for (yr=2005;yr<2010;yr++){
         for (month=0;month<12;month++){
           for (day=0;day<365;day++){
              std::string year = number_to_string(yr);
              std::string mon = number_to_string(month);
              std::string dd = number_to_string(day);
              std::string dname = DN+year+mon+dd+NC;
              std::cout << dname << std::endl;
             Quelldatei.open("dname", ios_base::in); // Datei öffnen
          }
         }
      }
    }
    

    Ich weiß nicht ob das so geschickt ist, aber es funktionier so mal 🙂



  • Ein stringstream löst das Problem ziemlich elegant:

    #include <iostream>                            
    #include <fstream>                             
    #include <sstream> 
    #include <string>
    #include <iomanip>
    
    using namespace std;
    int main() 
    {
       string DN = "Filename";
       string NC = ".nc";
    
       for( unsigned int yr = 2005; yr < 2010; yr++ )
       {
          for( unsigned int month = 0; month < 12; month++ )
          {
             for( unsigned int day = 0; day < 365; day++ )
             {
                ostringstream oss;
                oss << DN << year << month << day << NC;
    
                // falls Monat/Tag zweistellig formatiert werden müssen
                // oss << DN 
                //     << year 
                //     << setw( 2 ) << setfill( '0' ) << month 
                //     << setw( 2 ) << setfill( '0' ) << day
                //     << NC;
    
                ifstream ifs( oss.str().c_str() );
             }
          }
       }
    }
    

Log in to reply