Mit Daten Verarbeitung



  • Hi hab nen Problem will eine Datei Auslesen und bevor ich das tuhe will ich erst die Anzahl der Zeilen ermitteln nur irgendwie hab ich keine ahnung wie das geht da gibts doch sicherlich nen Befehl oder so für ?



  • Nein, dafür gibt es keine vordefinierte Funktion (Befehle gibt es in C++ sowieso nicht).

    Wenn du eine Datei zeilenweise einlesen willst, dann verwendest du am besten einen std::vectorstd::string in Verbindung mit der Funktion std::getline().



  • Pass nur auf, daß der Vektor nicht zu groß wird 😉

    Ernsthaft: Wenn du nur die Zeilenanzahl wissen möchtest, lauf durch die Datei und schau nach, wieviele Zeilenwechsel du findest. Die Anzahl der Zeilenwechsel+1 ist die Anzahl der Zeilen (die letzte Zeile hat ja keinen Zeilenwechsel mehr).

    Ich würde auch nur die angezeigte Bildschirmseite +/- 3 Seiten puffern. Alles andere braucht zu viel Speicher. Das Zeilenzählen sollte auch ein eigener Thread erledigen.



  • Ok was meinst du mit vector hab ich noch nie was von gehört.



  • iCh1989 schrieb:

    Ok was meinst du mit vector hab ich noch nie was von gehört.

    Dann informier Dich über die C++-Standardbilbiothek, insbesondere die STL. Folgendes ist z.B. eine gute Quelle: http://www.sgi.com/tech/stl/



  • Ok danke



  • geht das nicht auch so das ich einfach die komplette datei in ne Struktur lade und dann jedes Feld der Struktur überprüfe bis ich auf ein Feld stoße das leer ist dann weis ich das bis dahin Daten sind und weis dann sofort das hier keine Daten mehr kommen ? Würde ich dann einfach so machen

    for (int x=0;x<anzahl_daten;x++)
      {
        if (Daten[x].Artikel_Nr==NULL)
          {
            anzahl_daten=x;
          }
      }
    


  • Wie willst Du denn die Datei in die Struktur laden? Dazu müsstest Du dann doch auch alle Zeilen nacheinander einlesen.

    Nein, die einfachste Lösung ist schon, das in etwa so zu machen:

    unsigned int count = 0;
    std::ifstream infile("Dateiname");
    std::string line;
    while (std::getline(infile, line)) {
        // Hier die Zeile verarbeiten, oder auch einfach:
        ++line;
    }
    
    std::cout << "Es sind " << line << " Zeilen in der Datei." << std::endl;
    


  • Na ja irgendwie geht das nicht da spiel mein Compiler nicht mit der sag mir

    std::ifstream infile("datei");
    

    'ifstream' is not a member of 'std'
    zudem kennt der 'infile' nicht und es kommten noch ein Paar mehr Felder Meldungen



  • Wie gesagt: Setz Dich mit der Standardbibliothek auseinander. Diese Klassen befinden sich in Header-Dateien, die man einbinden muss:

    #include <fstream>  // Für std::ifstream
    #include <string>   // Für std::string
    #include <iostream> // Für std::cout und std::endl
    


  • Ist schon klar die sind schon drin



  • iCh1989 schrieb:

    Ist schon klar die sind schon drin

    Dann hast du entweder ein sehr veralteten Compiler oder aber sie stehen nicht dort wo du sie brauchst.

    cu André



  • Also das mit Alten Compiler na ja Borland C++ 5.02 von 1997 oder so 😃 ich kann aber normal die Datein einfach eben erneuern oder ?



  • iCh1989 schrieb:

    Also das mit Alten Compiler na ja Borland C++ 5.02 von 1997 oder so 😃 ich kann aber normal die Datein einfach eben erneuern oder ?

    Wenn du nicht zum Einsatz von dem Compiler gezwungen bist, steig möglichst schnell auf einen aktuellen um (unter Windows ist z.B. Visual C++ 2005 Express, MinGw... kostenlos). Und Header können nicht einfach zwischen den Compilern ausgetauscht werden, da sie nicht zwangsweise kompatibel sind (gerade bei so alten Compilern).

    cu André



  • Ja ne brauch den Borland für die Schule weil die den da Benutzten leider .Aber na ja der ist Teils auch besser als der Mircosoft Compiler find ich obwohl er ja nicht so viel kann. Ich versuch das einfach mal.Kann Maximal den Compiler schrotten mehr nicht.



  • iCh1989 schrieb:

    Ja ne brauch den Borland für die Schule weil die den da Benutzten leider.

    Solang du auf Standard-C++ setzt, sollte es unter allen Compilern klappen,

    Außer natürlidccolang du auf Standard-C++ setzt, sollte es unter allen Compilern kompiliert werden können.

    (NNatürlich nur, wenn du keine Sprachmittel bentutz, die nach 1997 dazu gekommen sind :D)



  • The-Kenny schrieb:

    Solang du auf Standard-C++ setzt, sollte es unter allen Compilern klappen,

    (NNatürlich nur, wenn du keine Sprachmittel bentutz, die nach 1997 dazu gekommen sind :D)

    Das große Problem ist, das der C++ Standard von 98 stammt, Compiler aus der Pre-Standard Zeit sowie aus der Umstiegszeit können eben keinen C++ Standard...

    Und ich würde mal einen Lehrer darauf aufmerksam machen das sich C++ mit der Zeit ändert (C++98 und vermutlich kommt in 2009 C++0x) und man auch mal mit der Zeit eine aktuallisierung durchführen sollte. Es müsste genügend Compiler geben die auch in Schulumfeld kostenlos zu bedienen sind.

    cu André



  • wozu? für borland 5.02 gibs sicherlich ne api doc. dort nachgucken und man weiss, wie die header und funktionen heissen. ob man nun programmieren mit standard c++ lernt oder nicht, spielt doch keine rolle.



  • thordk schrieb:

    wozu? für borland 5.02 gibs sicherlich ne api doc. dort nachgucken und man weiss, wie die header und funktionen heissen. ob man nun programmieren mit standard c++ lernt oder nicht, spielt doch keine rolle.

    Doch, das spielt schon eine Rolle, denn der C++-Standard ist das, womit man im Zweifelsfall später arbeitet, außerdem ist der Standard weitaus besser designed als andere Bibliotheken; besonders der STL-Teil davon. Es ist also sinnvoll, gerade als Anfänger die gut durchdachte STL statt einer komplexen 3rd-Party-Bibliothek zu verwenden.



  • PS: Ich habe damals auch nach Buch mit Borland 5 oder 6 C++ gelernt und konnte dann auch komplette kleine Anwendungen schreiben … nur: Ich habe *alles* vergessen. Ich musste danach noch einmal komplett neulernen. Es ist nicht eine einzige Sache hängengeblieben.


Anmelden zum Antworten