Formatierte ASCII datei lesen



  • HAllo Liebe C++ Programmierer,
    ich bin ein Einsteiger von Fortran auf C++. ich habe mal problem beim formatierte Dateien auslesen. ich habe eine Datei, in der 62483 zeile und 3 spalten gibt.
    Erste Spalte hat integer zahlen zweite float zahlen und dritte character.
    das Format vonder datei ist so 8 Zeichenplatz als integer, 6 Zeichenplatz als float, und 28 Zeichenplatz als Character. Also anderes gesagt, %8i, %6f, %28c ist das Format von der Datei. So die Frage Wie kann ich diese Datei lesen.
    Unter Fortran ist das ein kinder spiel. Aber Es sieht so aus dass es unter c++ nicht so einfach ist. Ich bin seit 2 tage am Bücher lesen, googlen und Forum durchsuchen, aber leider mit keinen Erfolgs. Kann jemand mir bitte das erklären wie ich das machen kann. Ich danke allen im Voraus für ihre gegebene Mühe.
    MfG


  • Administrator

    std::ifstream inputStream("file.dat");
    
    int integer;
    float real;
    std::string characters;
    
    while(inputStream >> integer >> real >> characters)
    {
      // mach was damit, speichere sie ab oder sonst was.
    }
    

    Die Streams ignorieren Whitespaces automatisch. Hier wird also ein int eingelesen, danach ein float und am Ende noch ein Wort. Zwischen den Einleseoperationen werden die Whitespaces immer ignoriert.

    Ich empfehle dir ein gutes C++ Buch zu kaufen. Einfache Anfängerbücher:
    - C++ Primer
    - Thinking in C++ 1&2 (Auch gratis als PDF verfügbar, aber englisch)

    Anfängerbuch mit deutlich steilerer Lernkurve:
    - Die C++ Programmiersprache von Bjarn Stroustrup
    (bzw. The c++ programming language, falls du es in Englisch willst)

    Grüssli


  • Mod

    Ist da irgendein Trennzeichen (Leerzeichen) dazwischen? Wenn ja, dann kann man einfach

    inputfilestream >> integervariable >> floatvariable >> stringvariable;
    

    machen. Wenn es kein Trennzeichen gibt, würde ich die ganze Zeile in einen String lesen und den dann an den bekannten Trennstellen auseinanderschneiden. Die einzelnen Fragmente können dann über einen Stringstream in das gewünschte Datenformat überführt werden.

    edit: 8 Sekunden zu spät... 😞


  • Administrator

    SeppJ schrieb:

    edit: 8 Sekunden zu spät... 😞

    Naja, du hast aber noch eine gute Sache reingebracht. Hätte nicht daran gedacht, dass jemand keine Whitespaces dazwischen setzen würde 😉

    Edit: Zum ganze Zeilen einlesen:
    http://www.cplusplus.com/reference/string/getline/

    Grüssli



  • Ich danke euch alle ganz herzlich, dass ich so schnell und hilfsreiche Antworten gekriegt habe. meine Datei sieht so aus

    ____6784__0.05__hier_kommen_die_texte_mit

    jede "_" bedeutet ein leere Zeichenplatz. D.h in der datei nehmen die Werte macnhmal Ihre maximale Größe aber zwischen jede array bleibt natürlich mindestens ein leer zeichen.


  • Administrator

    Unter der Annahme, dass _ ein Platzhalter in diesem Forum für ein Leerzeichen ist, dann sollte es halt so aussehen:

    // ...
    while(inputStream >> integer >> real && std::getline(inputStream, characters))
    // ...
    

    Einziges Problem ist, welches du nun noch hast, dass nun in characters auch die Leerzeichen drin sind, welche zwischen dem Float und den Characters sind. Aber eine einfache Left-Trim-Funktion kann man ja schnell programmieren.

    String Header Referenz:
    http://www.cplusplus.com/reference/string/

    Grüssli



  • es hat wunderbar geklappt. Vielen vielen Dank

    Herzliche Grüße


Anmelden zum Antworten