aus einer Textdatei einlesen



  • Hallo zusammen,

    also ich möchte in einer MFC-Anwendung von einer Textdatei einlesen...

    soweit so gut, ich hab es schon mal soweit geschafft, etwas in den string einzulesen...

    hier der auszug von meiner datei:

    // Öffnen der Länder-Datei
        fileLoad.open("Länder.txt",ios::in);
    
        // Hat das anlegen der Datei funktioniert
        if (fileLoad)
        {
            while( ! fileLoad.eof())
            {
                char help[300];
                char help2[300];
                float fhelp;
                CString command;
    
                // erste Zeile einlesen
                fileLoad.getline(help, sizeof(help));
                command = help;
    
                if(command == "Austria")
                {
                    fileLoad.getline(help, sizeof(help));
                    mLaender.AddString(Name);
                }
        }
    

    Jetzt habe ich das Problem, dass ich folgendes aus der ".txt"-Datei auslese:

    "Austria", 26.4, 15.00

    wenn ich jetzt alles in einen string einlese, funktioniert das ja nicht, kann ich das irgendwie splitten oder so??

    ich möchte also "Austria" extra einlesen, 26.40 extra einlesen und 15.00 einlesen...

    wie kann ich das am besten machen??

    lg reink



  • CStringT Tokenize(
       PCXSTR pszTokens,
       int& iStart
    ) const
    

    dürfte dir helfen.



  • Pellaeon schrieb:

    CStringT Tokenize(
       PCXSTR pszTokens,
       int& iStart
    ) const
    

    dürfte dir helfen.

    und wie soll ich das dann anwenden??
    kann mir da jemand weiterhelfen, weiß nicht recht wie ich das
    anwenden kann!?!?



  • Wenn du mit Pallaeons Tipp nicht zurecht kommst probiers mal hiermit:

    void SeparateString(CString string,int *values){
      int old=0, pos=0;
      CStringArray string_array;
    
      while(-1!=(pos=string.Find(',',pos))){
        string_array.Add(string.Mid(old,pos-old));
        old = ++pos;
      }
      if(old < string.GetLength()) string_array.Add(string.Mid(old,string.GetLength()-old));
    
      for(int i=0;i<3;i++){
        values[i] = atoi(string_array[i]);
      }
    }
    

    Die Funktion teilt einen String in Einzelstrings (bei jedem ","). Bei mir waren es immer drei Integerwerte, musst es halt noch auf deine Bedürfnisse hin anpassen!



  • Wenn du die Methode da mal in der MSDN nachschaust, dann ist dort ein Code-Beispiel, wo erklärt wird, wie man den String zerlegt. Daher bin ich jetzt zu faul mir was auszudenken^^



  • reink13 schrieb:

    Jetzt habe ich das Problem, dass ich folgendes aus der ".txt"-Datei auslese:

    "Austria", 26.4, 15.00

    wenn ich jetzt alles in einen string einlese, funktioniert das ja nicht, kann ich das irgendwie splitten oder so??

    ich möchte also "Austria" extra einlesen, 26.40 extra einlesen und 15.00 einlesen...

    wie kann ich das am besten machen??

    Hallo reink,
    Die Grundregel lautet: immer das Lesen, was Du später auch haben willst. In Deinem Fall also string, float, float - und der String steht in Hochkommata und zwischen den floats stehen noch Kommas. Das muss überlesen werden.

    Zum Überlesen baue man sich ein kleines Helferlein:

    template< char C >
    std::istream& Char( std::istream& in )
    {
        char c;
        if( in >> c && c != C )
            in.setstate( std::ios_base::failbit );
        return in;
    }
    

    das erfordert nur #include <iostream> und der Rest ist dann kein Problem

    std::ifstream fileLoad("Länder.txt");
        if( fileLoad.is_open() )
        {
            float f1, f2;
            std::string cmd;
            if( getline( fileLoad >> Char<'"'>, cmd, '"' ) >> Char<','> >> f1 >> Char<','> >> f2 )
            {
                // Lesen war Ok; Daten stehen in: cmd, f1 und f2
            }
        }
    

    Gruß
    Werner



  • Hallo Werner,

    danke für deine Hilfestellung...
    Jetzt habe ich noch folgendes Problemchen:

    [cpp]std::ifstream fileLoad("Länder.txt");
        if( fileLoad.is_open() )
        {
            float f1, f2;
            std::string cmd;
            if( getline( fileLoad >> Char<'"'>, cmd, '"' ) >> Char<','> >> f1 >> Char<','> >> f2 )
            {
                // Lesen war Ok; Daten stehen in: cmd, f1 und f2
            }
        } [/cpp]
    

    der compiler schreit, klarer weise, bei "getline"....
    "getline": Bezeichner wurde nicht gefunden...

    Jetzt sieht es bei mir so aus:

    [cpp]            if( fileLoad.getline( fileLoad >> Char<'"'>, command, '"') >> Char<','> >> f1 >> Char<','> >> f2)
                {
    
                }[/cpp]
    

    und da kommt die fehlermeldung:
    "Konvertierung des Parameters 1 von 'std::basic_istream<Elem,_Traits>' in 'char *' nicht möglich

    Abhilfe??

    lg reinki



  • reink13 schrieb:

    der compiler schreit, klarer weise, bei "getline"....
    "getline": Bezeichner wurde nicht gefunden...

    #include <string>

    und ggf. std::getline( .. ) falls Du noch VC6 benutzen solltest

    Gruß
    Werner


Anmelden zum Antworten