Anzahl der Zeichen in einer Textdatei auslesen?


  • Mod

    djnforce schrieb:

    Das Programm soll nicht perfekt sein. Es muss nur funktionieren...

    Es gibt einen Unterschied zwischen nicht-perfekt und schlecht. Du könntest mit einfacheren Mitteln in viel kürzerer Zeit ein viel besseres Ergebnis erreichen, wenn du dich nicht so verbissen an deine (abgeschriebene) Lösung klammern würdest. Ich habe irgendwie den Eindruck, dass outs Lösung aus dem anderen Thread nicht so ganz ernst gemeint war...


  • Mod

    Spaßeshalber vergleich doch mal die Geschwindigkeit (Compileroptimierungen nicht vergessen!):
    1. deine Lösung
    2. etwas umständliche C++-Lösung von mir (die aber trotzdem besser sein könnte als das bisherige)
    3. Quick&Dirty C-Lösung (inspiriert von Wutz aus anderem Thread. Vermutlich die schnellste Lösung)
    4. etwas umständliche grep-Lösung

    (Man beachte, dass die Programme jeweils leicht unterschiedliche Ausgaben haben. Ich bin nicht 100% sicher, was die Aufgabe ist. Ich habe jeweils eine mir sinnvoll erscheinende Lösung gewählt)

    Codes:
    1. hast du selber
    2.

    #include <string>
    #include <fstream>
    #include <iterator>
    #include <tuple>
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    double parse_fs(const string &data, size_t pos)
    {
      return strtod(data.c_str() + pos, 0);
    }
    
    tuple<double, double> parse_coord(const string &data, size_t pos)
    {
      double x = strtod(data.c_str() + pos, 0);
      size_t after_comma = data.find(',', pos) + 1;
      double y = strtod(data.c_str() + after_comma, 0);
      return make_tuple(x,y);
    }
    
    int main()
    {
      ifstream file("test.dat");
      string data(istreambuf_iterator<char>(file.rdbuf()), istreambuf_iterator<char>());
    
      const string what_fs = "Fieldstrength : ";
      const string what_coord = "Coord:(";
    
      size_t fs_pos = data.find(what_fs);
      size_t coord_pos = data.find(what_coord);  
      if (fs_pos != string::npos) cout << "Fieldstrength : " << parse_fs(data, fs_pos + what_fs.length()) << '\n';
      if (coord_pos != string::npos) 
        {
          double x, y;
          tie(x,y) =  parse_coord(data, coord_pos + what_coord.length());
          cout << "Coord x: " << x << "\nCoord y: " << y << '\n';
        }
    }
    

    Falls du kein C++11 hast, lass die Tupel eben weg.
    3.

    #include <stdio.h>
    
    int main()
    {
      FILE *file = fopen("test.dat", "r");
      int c;
      while ((c = fgetc(file)) != EOF)
        {
          double fs, x, y;
          if (c == 'F' && 1 == fscanf(file, "ieldstrength : %lf", &fs))
            printf("Fieldstrength: %f\n", fs);
          if (c == 'C' && 2 == fscanf(file, "oord:(%lf,%lf", &x, &y))
            printf("Coord x: %f\nCoord y: %f\n", x, y);
        }
    }
    
    FS=`grep -o -m1 "Fieldstrength : [0-9]*" $1 | cut -d' ' -f3`
    XY_STRING=`grep -o -m1 "Coord:([0-9]*,[0-9]*)" $1`
    X=`echo $XY_STRING | cut -d'(' -f2 | cut -d',' -f1`
    Y=`echo $XY_STRING | cut -d',' -f2 | cut -d')' -f1`
    echo $X, $Y, $FS
    

  • Mod

    Falls du kein C++11 hast, lass die Tupel eben weg.

    Wieso nicht gleich pair ?
    Und strtod ist auch C++11.
    Edit: Nein, strtod nicht.


  • Mod

    Arcoth schrieb:

    Falls du kein C++11 hast, lass die Tupel eben weg.

    Wieso nicht gleich pair ?

    Weil tuple das bessere pair ist, sofern man tuple zur Verfügung hat.



  • Mir ist bewusst, dass ich der wahrscheinlich schlechteste Programmierer der Welt bin. Der Fakt ist aber,dass es darum nicht geht.
    Bei meiner Anwendung spielen weder Zeit, noch Effizienz eine Rolle.
    Es geht nur darum, die Werte auszulesen.

    Ich bin auch kein gelernter Programmierer o.ä.. Das bedeutet auch, dass ich nichtmal beurteilen kann wie schlecht mein Algorithmus ist.

    Fakt ist, dass ich euch und diesem Forum sehr sehr dankbar bin für die Unterstützung.

    Macht weiter so...

    Viele Grüße


Anmelden zum Antworten