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 einfachst1="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.ncUnd 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
stringstreamlö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() ); } } } }