Mit vc++ 6 *.txt Dateien einlesen



  • Hallo

    Ich habe als Visual Einsteiger ein Problem dem ich nicht Herr werde.
    Die Txt Datei hat folgendes aussehen:

    Created by GPS TrackData 1.3b6
    Copyright (c) 2002-2003 Lars Jakobsen
    http://www.GPSutility.dk

    Description: xxxxxxxx xxxxxxxx
    Track start: hh🇲🇲ss
    Track date: jahr-monat-tag
    GPS receiver: Unknown GPS
    Save: Movements

    record fix hour min sec msec latitude longitude alt speed course sat hdop
    1 3 13 20 14 350 50.8835933 11.5932117 203.80 8.0 351.6 3 25.0
    2 3 13 20 17 350 50.8836967 11.5931817 204.10 15.7 355.0 8 0.9
    3 3 13 20 19 350 50.8837883 11.5931583 204.50 18.7 347.3 8 0.9
    4 3 13 20 21 350 50.8838967 11.5931450 205.90 22.2 357.8 8 0.9

    Jetzt muss ich die Spalten latitude, longitude und alt auslesen. Jede der einzelnen Spalten würde ich dann in einen Puffer schreiben wollen, damit ich sie später bearbeiten kann.

    Mein Quelltext hat bis jetzt folgendes Aussehen:

    char buffer[4096];
    ...
    CFile sourceFile(dlg.GetPathName(),CFile::modeRead);               
    sourceFile.Open(dlg.GetPathName(),4096,NULL);
    sourceFile.Read(buffer,4096);
    

    //dlg ist bei mir ein Dialogfenster zum öffnen einer Datei

    Wenn ich das Programm nun ausführe bringt er mir ne Fehlermeldung: Debug Assertion Failed!
    Er verweist dann noch auf die Datei filecore.cpp Zeile 157, mit der ich aber nichts anzufangen weiss.

    Kann mir bei diesem Problem jemand helfen? Danke schonmal im voraus.

    tschö



  • Drück "Wiederholen" und zeig die Zeile, wo der Grüne Pfeil steht und ein wenig drumrum. 🙂



  • Ob die 4096 vom buffer so toll ist, weiss ich nicht... (ich glaube, eher nicht).

    Ansonsten änder mal
    CFile sourceFile(dlg.GetPathName(),CFile::modeRead);
    in
    CFile sourceFile;

    Und statt
    sourceFile.Open(dlg.GetPathName(),4096,NULL);
    machst du
    sourceFile.Open(dlg.GetPathName(), CFile::modeRead, NULL);

    Ich glaube, ich würde lieber CStdioFile benutzen und die Datei mit ReadString zeilenweise einlesen.



  • Bei der Zeile sourceFile.Read(buffer,4096); zeigt er die Fehlermeldung an.
    Tja, viel hab ich noch nicht drumrum, danach kommt nur noch UpdateData(FALSE) , weil ich es auch in einem Editfenster ausgeben wollte.
    Das Fenster hat die Variable m_ausgabe (CString), funzt aber auch noch nicht so.

    char buffer[4096];
    CFileDialog dlg(TRUE);
    dlg.DoModal();
    m_ausgabe=dlg.GetPathName();
    
    CStdioFile sourceFile;
    sourceFile.Open(dlg.GetPathName(),CStdioFile::modeRead,NULL);
    m_ausgabe=sourceFile.ReadString();
    
    UpdateData(FALSE);
    

    So, das ist meine Funktion bis jetzt. Die Ausgabe soll also in einem Editfenster erfolgen, und zugleich in einen Puffer eingelesen werden.

    tschö

    estartu_de schrieb:

    Drück "Wiederholen" und zeig die Zeile, wo der Grüne Pfeil steht und ein wenig drumrum. 🙂



  • sind die Koordinaten immer an der selben Stellen?

    dann würd ich wie isabeau schon sagte einfach nen CStdioFile machen.
    die Zeile mit ReadString in ein CString einlesen und dann mit substr
    die Stellen aus dem String holen und damit weiter arbeiten.

    Falls sie nciht fest sind, einfach das xte Lehrzeichen suchen und von da aus
    so und soviel Zeichen..

    Is doch viel einfacher, oder?

    Du solltest vielleicht auch

    CFileDialog dlg(TRUE); 
    if(dlg.DoModal() == true)
    {
    // File-Aktionen
    }
    

    machen, denn sonst könnte er dir auf die Klappe fliegen wenn mal jemand
    auf abbrechen drückt 🙂



  • Ja, die Koordinaten sind immer an der selben Stelle.

    Der Befehl ReadString gibt doch wenn eof erreichet ist NULL zurück. Dann könnte ich doch wenn ich alle Zeilen haben möchte:

    do
    {
      CString_Name=sourceFile.ReadString(buffer,99);
    }
    while(dwRead != NULL)
    

    Schreibt er dann eigentlich immer in die selbe Zeile, oder nimmt er die nächste?



  • Ich hatte das mal so:

    // ~~~~~~~~~~~ >8 *snip* ~~~~~~~~~~~
    
    CString cZeile;
    CStdioFile File;
    
    if(File.Open("C:\\bla\\Datei.txt", CStdioFile::modeRead))
    {
    	unsigned long Laenge = File.GetLength();
    
    	while (File.GetPosition() != Laenge)
    	{
    		File.ReadString(cZeile);		// eine Zeile lesen
    
    		// mach was mit der Zeile
    	}
    
    	File.Close();
    }
    
    // ~~~~~~~~~~~ >8 *snap* ~~~~~~~~~~~
    

    Für deine Ausgabe im Editfeld könntest du dann noch z.B.
    m_ausgabe += cZeile + "\r\n";
    in die while-Schleife schreiben.



  • Juhu 😉

    Bis hierin geht es erstmal tausend und einen dank.

    Den Bezeichner substr kennt er bei mir net, welche include muss ich da eigentlich einbinden?

    tschö mit ö


Anmelden zum Antworten