Textdatei lesen und anzeigen



  • Hallo,
    ich habe in C++ folgendes vor.
    Ich möchte aus einer Textdatei (text.txt) die Daten auslesen und anzeigen.
    Wie mache ich das?

    Vielen Dank und Grüße



  • welche daten?

    es gibt ca. 20versch. arten, eine datei auszulesen - wenn du uns sagst, was drin steht, können wir dir vll den in deinem fall besten weg zeigen 😉

    bb



  • In der Datei steht folgendes:

    char zeichen[] = "qwertz";
    int zahl = 1234;
    float f = 12.34f;
    string s = "hallo";



  • bordon schrieb:

    In der Datei steht folgendes:

    char zeichen[] = "qwertz";
    int zahl = 1234;
    float f = 12.34f;
    string s = "hallo";

    Binär? Oder in Textform, wie du es geschrieben hast?



  • Ich möchte es sowohl Binär, als auch als Textdatei auslesen.
    Darüber hinaus möchte ich die Daten in andere Variablen schreiben.



  • wer legt denn so was fest?
    dafür ist c++ ein wenig ungeeignet...

    //strings
    zeichen = asd
    //ints
    zahl = 123
    //floats
    f = 123.f
    

    würde noch relativ einfach gehen.
    aber schon zeichen[] wäre imho nicht all zu leicht zu parsen.
    und man bräuchte vermutlich für jeden datentyp einen container(z.B. map mit key==string, in dem der name steht).

    es würde also auch so gehen:

    string zeichen = asd
    int zahl = 123
    float zahl = 123.f
    string zeichen2 = hjkl
    int q = 1234
    

    ein möglicher ansatz wäre:

    struct values
    {
      template<typename T>
      struct container
      {
        typedef std::map<std::string, T> type;
      };
    
      container<float>::type floats;
      container<int>::type ints;
      container<std::string>::type strings;
    
      friend std::istream& operator<< (std::istream& s, values& these)
      {
        std::string type;
        std::string name;
        std::string value;
    
        s >> type >> name >> skip_char<'='>();
        std::getline(s, value);
    
        if(s.bad())
          return s;
    
        if(type == "string")
        {
          strings[name] = value;
          return s;
        }
    
        std::stringstream ss;
        ss << value;
    
        if(type == "int")
          ints[name] << ss;
        if(type == "float")
          floats[name] << ss;
    
        /*evtl. noch failbits von ss auf s übertragen*/
    
        return s;
      }
    
    private:
      template<char character>
      struct skip_char
      {
        friend std::istream& operator<<(std::istream& s, skip_char&)
        {
          char val;
          s >> val;
          if(val != character)
            s.setstate(std::ios::failbit);
          return s;
        }
      };
    };
    

    bb

    edit:
    anzuwenden:

    int main()
    {
      values config_values;
      std::istream config("config.txt");
    
      while(config_values << config);
    
      std::cout << config_values.strings["zeichen"] << std::endl;
    }
    


  • Viel besser:

    x = "String"
    y = 10
    z = 15.14141
    

    Sollte vom Parsen auch nicht sonderlich schwer sein.



  • ich will keine config-datei, in der ich nicht mal sehe, welchen typ und wertebereich eine variable hat...
    und einfacher zu implementieren ist diese version auch keinesfalls...

    bb



  • Hab in einem Buch nachgelesen und folgende funktionierende Lösung geschrieben:

    char var1[10]; int var2; float var3; string var4;

    ifstream read("Text.txt");
    read >> var1;
    read >> var2;
    read >> var3;
    read >> var4;

    for(int i=0;i<=strlen(var1);i++){
    cout << var1[i];
    }
    cout << var2 << endl;
    cout << var3 << endl;
    cout << var4 << endl;



  • aber nicht mit der text-datei von oben : D



  • Mit der Textdatei die ich angegeben hab! Funktioniert alles



  • troll?

    char zeichen[] = "qwertz";
    int zahl = 1234;
    float f = 12.34f;
    string s = "hallo";
    

    das hast du als txt-datei angegeben gehabt... das kann gar nich gehen oO

    wenn natürlich nur

    qwerzt
    1234
    12.34f
    hallo
    

    drin steht, geht es logischerweise - allerdings hättest du dann nicht so nen crap dazu schreiben müssen, der gar nicht drin stand... -.-'

    naja - schön, dass es jetzt funktioniert...

    bb

    PS:

    for(int i=0;i<=strlen(var1);i++){
    cout << var1[i];
    }
    

    ->

    cout << var1;
    //oder
    cout.write(var1, strlen(var1));
    

    oder aber besser:

    //#include<cstring>, <cstddef>, <algorithm>, <iostream>
    
    const std::size_t max_size = 10;
    char var1[max_size];
    
    read >> var1;
    
    cout.write(var1, std::min(strlen(var1), max_size));
    

Anmelden zum Antworten