Jak odczytać z pliku pojedyncze dane występujące po danym wyrażeniu.

0

Cześć, chciałbym odczytać dane z pliku, jednak nie umiem zrobić tego w taki sposób, aby mój program brał tylko te dane na których mi zależy. Mój plik wygląda tak jak poniżej. Co jakiś czas podane są w nim współrzędne, które występują po słowie lat i lon. Chciałbym ich wartości zapisać bezpośrednio w tablicy (albo w wektorze). Docelowo mój plik będzie składał się paru tysięcy takich współrzędnych. Ogólnie wiem jak, otwierać pliki, jak czytać z pliku linia po linii, jednak nie mam pomysłu jak mogę wczytać tylko dane występujące po danej frazie. Będę wdzięczny za radę czy też podesłanie linku do rozwiązania podobnego problemu.

  <?xml version="1.0" encoding="UTF-8"?>
<gpx creator="StravaGPX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
 <metadata>
  <time>2022-07-24T10:38:39Z</time>
 </metadata>
 <trk>
  <name>Lunch Ride</name>
  <type>1</type>
  <trkseg>
   <trkpt lat="50.1327350" lon="19.7884230"> //!!!!! O TE WSPÓŁRZĘDNE MI CHODZI!!!!!
    <ele>232.6</ele>
    <time>2022-07-24T10:38:39Z</time>
    <extensions>
     <gpxtpx:TrackPointExtension>
      <gpxtpx:atemp>28</gpxtpx:atemp>
     </gpxtpx:TrackPointExtension>
    </extensions>
   </trkpt>
   <trkpt lat="50.1327350" lon="19.7884230">
    <ele>232.6</ele>
    <time>2022-07-24T10:38:42Z</time>
    <extensions>
     <gpxtpx:TrackPointExtension>
      <gpxtpx:atemp>28</gpxtpx:atemp>
     </gpxtpx:TrackPointExtension>
    </extensions>
   </trkpt>
   <trkpt lat="50.1327350" lon="19.7884230">
    <ele>232.6</ele>
    <time>2022-07-24T10:38:46Z</time>
    <extensions>
     <gpxtpx:TrackPointExtension>
      <gpxtpx:atemp>28</gpxtpx:atemp>
     </gpxtpx:TrackPointExtension>
    </extensions>
   </trkpt>
   <trkpt lat="50.1327650" lon="19.7881110">
    <ele>233.0</ele>
    <time>2022-07-24T10:38:50Z</time>
    <extensions>
     <gpxtpx:TrackPointExtension>
      <gpxtpx:atemp>28</gpxtpx:atemp>
     </gpxtpx:TrackPointExtension>
    </extensions>
   </trkpt>

   i tak dalej...
3

Użyj jakiegoś parsera XML, np. Expat:

https://libexpat.github.io/doc/getting-started/

3

Jak bardzo duży jest ten plik?
Jeśli mały to parsery DOM są najłatwiejsze w użyciu, ja polecam:

Jeśli plik jest duży to najlepszym rozwiązaniem jest parser SAX:

0

@Bartłomiej Golenko: @MarekR22 Dziękuję za rady. Powiem szczerze, nie słyszałem nigdy o parserach. Dopiero zaczynam programować. Będę musiał sobie jakieś poradniki do ów parserów znaleźć, bo nie za bardzo rozumiem o co w nich chodzi. Jak rozumiem, aby całość działa, należy pracować na plikach xml tak?
Na ten moment udało mi się wymyślić coś takiego. Domyślam się, że nie jest to rozwiązanie idealne, ale chociaż je dobrze rozumiem.

void addingData(double (*parameters), size_t c, string fileName)
{
    ifstream fileGPX;
    fileGPX.open(fileName, ios::in);
    string line;
    unsigned i = 0;

    if(fileGPX.is_open())
    {
        while (getline(fileGPX, line))
        {
            if(line.find("lat=") <= 1000)
            {
                *(parameters+i*c+0) = stod(line.substr(line.find("lat=") + 5, 10));
                *(parameters+i*c+1) = stod(line.substr(line.find("lon=") + 5, 10));
                i++;
            }

        }
    }
    else
        cout << "cannot open the file";
}

2

Jeśli Twoje pliki to tylko GPX, to może zerknij na

https://github.com/irdvo/gpxlib

W repo mają przykład czytania pliku GPX

Troszkę zmodyfikowałem (bez sprawdzania czy się kompiluje!) żeby lepiej było widać co się dzieje - oryginał: link

#include "gpx/Parser.h"
#include "gpx/ReportCerr.h"


int main()
{
  ifstream stream("plik.gpx");

  if (stream.is_open())
  {
    gpx::ReportCerr report;
    gpx::Parser parser(&report);
    gpx::GPX *root = parser.parse(stream);

    if (root == nullptr)
    {
      cerr << "Parsing failed due to " << parser.errorText() << " on line " << parser.errorLineNumber() << " and column " << parser.errorColumnNumber() << endl;
      abort();
    }
      
    list<gpx::WPT*> &wpts = root->wpts().list();
      
    for (list<gpx::WPT*>::iterator node = wpts.begin(); node != wpts.end(); ++node)
    {
      gpx::WPT *wpt = (*node);
      if (wpt != nullptr)
      {
        cout << "Position: " << wpt->lat().getValue() << ',' << wpt->lon().getValue() << endl;
      }       
    }
    
  }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1