ascii file auslesen



  • Hallo,

    ich habe ein ascii File, welches ich auslesen möchte. Es ist so geschrieben, daß jeweils eine Zahl in einer Zeile gespeichert ist (dabei sind die Zahlen Werte jeweils floats), und es besteht ein header der in der ersten Zeile einen Text hat, in der zweiten ein Integer, dann wieder einen Text und einen Integer. Dies interessiert mich aber nicht so berennend, ich brauche die floats ab Zeile 5.

    FILE *Datei;
    Datei = fopen("....","r");
    

    Soweit kein Problem. Nun möchte ich mit fread auslesen. Aber wie mache ich das? Wie erreiche ich einen Zeilenumbruch? Das Problem ist auch, daß die Floats nicht immer die gleiche Länge haben, sondern wenn z.B. eine 0 am Ende stehen sollte, wurde diese einfach weggelassen. Außerdem ist die Anzahl der Vorkommastellen verschieden.

    Kann mir jemand helfen?

    Florian



  • Erstmal: Du bist im C++ Board, also nimm bitte auch fstreams (das C-Board ist eine Etage höher).

    Zweitens: fread() ist ungeeignet für deinen Zweck, weil es Daten fester Länge einliest (und deine Zeilen haben keine feste Länge). Nimm lieber fgets() (bzw. getline()).

    Drittens: float-Werte kannst du mit fscanf() (bzw. operator>>) einlesen und direkt in Zahlenformat umwandeln lassen - da ist es egal, wieviele Stellen die Zahl hat.



  • Wenn z.B. dies die Datei 'input.txt' ist:

    Text in der erste Zeile
      -234
    noch mehr Text
      4711 <- interessiert nicht
    101.12
    102.34
    103.56
    104.9
    

    Dann kann man sie so einlesen:

    #include <iostream>
    #include <fstream>  // ifstream
    #include <vector>
    #include <limits>   // numeric_limits
    #include <iterator> // istream_iterator
    
    std::istream& header( std::istream& in )
    {
        // 4 Zeilen überlesen
        for( int i=0; in && i<4; ++i )
            in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
        return in;
    }
    
    int main()
    {
        using namespace std;
        ifstream file("input.txt");
        vector< double > zahlen( (istream_iterator< double >( file >> header )), istream_iterator< double >() );
        // .. ab hier sind alle Zahlen im std::vector 'zahlen'
        cout << zahlen.size() << " Zahlen gelesen" << endl;
        return 0;
    }
    

    Die Ausgabe ist:

    4 Zahlen gelesen
    

    Gruß
    Werner


Anmelden zum Antworten