Stream aus Datei auslesen



  • Mal davon ausgegangen das du fstring erst mal über ifstream eingelesen hast

    template< typename ConvertTo >
    void convert( ConvertTo & to, std::string const & from ){
       // Falls boost vorhanden besser auf boost::lexical_cast< ConvertTo > zurückgreifen
       std::istringstream istr( from );
       istr >> to;
       // throw exception on error
    }
    
    void convert( std::string & to, std::string const & from ){
       to = from;
    }
    
    struct Data {
      std::string data;
      std::string description;
      long size;
      long sell;
    
      template< typename TargetT >
      void read( std::istream & is, TargetT & target ){
          std::string value;
          if( std::getline( is, value, ';' ) ){
             convert( target, value );
          }
          else {
            // throw exception 
          } 
      }
      void fromString( std::string const & line ){
          std::istringstream istr( line );
          read( ostr, name );
          read( ostr, description );
          read( ostr, size );
          read( ostr, sell );
      }
    };
    
    // std::ifstream ifs... falls von einem string dann kannst du std::istringstream verwenden 
    std::string line;
    while( std::getline( ifs, line) ) {
       Data myclass;
       myclass.fromString( line );
    }
    

    Deins ist natürlich kürzer aber man könnte das so in der art lösen

    BR

    Edit: ostream <=> istream 🙄



  • Hallo Scarabol,

    wie sieht die Datei aus, die in fstring eingelesen wurde. Und welche Texte oder Zahlen möchtest Du in welche Variablen einlesen. Das geht auf jeden Fall besser als dieses String-auseinander-gefiesele.
    Aber hilfreicher als der Code den Du geschrieben hast, wäre das Format der Datei.

    Gruß
    Werner



  • Hi,

    die Datei hat folgendes Format:

    // Kommentar
    0;250;5;10;0;data/texture.png;
    0;125;7;13;1;data/texture2.png;
    ...
    

    MfG
    Scarabol



  • Hallo Scarabol,

    dann verwende doch die normalen Stream-Operatoren:

    std::istringstream istr(fstring);
    
    char c;
    istr >> myclass.x >> c >> myclass.y >> c >> myclass.z; // für Zahlenwerte
    // bzw.
    std::getline(istr, myclass.name, ';'); // für Strings
    

    Zur Sicherheit könntest du dann auch noch die Variable c überprüfen, ob dort wirklich ein Semikolon drin steht.

    P.S. evilissimo, deine read-Funktion sollte wohl eher einen istream entgegennehmen: void read( std::istream & is, ...)
    ebenso fromString: std::istringstream istr( line ) 😉



  • lol ja sollte es eigentlich. Ich hab das nicht getestet. Nur so runter geschrieben :p



  • Danke, genau das hab ich gesucht.

    MfG
    Scarabol



  • Hi,

    also irgendwie kann ich getline nicht mit std::string benutzen, er will immer ein char * haben, wieso?

    MfG
    Scarabol


  • Mod

    Scarabol schrieb:

    Hi,

    also irgendwie kann ich getline nicht mit std::string benutzen, er will immer ein char * haben, wieso?

    MfG
    Scarabol

    Weil es zwei getlines gibt, und du anscheinend das flasche benutzt. Das eine ist eine Memberfunktion von istream und will einen char*:
    http://www.cplusplus.com/reference/iostream/istream/getline/

    Das andere ist eine freie Funktion im string Header und will einen std::string:
    http://www.cplusplus.com/reference/string/getline/



  • oh mann, ich depp vielen dank



  • Hi,

    noch eine Frage:

    Ich habe ein stringstream objekt mit folgendem Inhalt:
    "10,20;20,30;;"
    wie kann ich nun aus diesem stream sub streams erzeugen so das ich folgendes erhalte:
    sub1 "10,20"
    sub2 "20,30"
    sub3 "
    "

    sub1,2,3 sollten vom Typ stringstream sein.

    MfG
    Scarabol



  • Scarabol schrieb:

    Ich habe ein stringstream objekt mit folgendem Inhalt:
    "10,20;20,30;;"
    wie kann ich nun aus diesem stream sub streams erzeugen so das ich folgendes erhalte:
    sub1 "10,20"
    sub2 "20,30"
    sub3 "
    "

    sub1,2,3 sollten vom Typ stringstream sein.

    Zum Beispiel so:

    #include <iostream>
    #include <sstream>
    
    int main()
    {
        using namespace std;
        istringstream inhalt("10,20;20,30;*;");
        for( string s; getline( inhalt, s, ';' ); )
        {
            stringstream sub( s );
            cout << "Der Inhalt des stringstream ist: " << sub.str() << endl;
        }
        return 0;
    }
    

    .. wofür soll das gut sein? Ich glaub' das geht noch besser, wenn Du uns erzählst zu was Du den Inhalt in stringstreams benötigst. I.A. kann man sich die stringstreams sparen.

    Gruß
    Werner



  • Hi,

    der Inhalt des Stringstreams enthält die Daten die ich für das Programm brauche und die statisch sind. Wie z.B. Daten für Raumschiffe, Frachtgüter oder Stationen ect.

    MfG
    Scarabol


Anmelden zum Antworten