Wybranie okreslonych wierszy z pliku .txt

0

Witam,
mam na zaliczenie napisać program w c++ i mam problem
Posiadam plik .txt z danymi.

Chcę wybrać tylko te linie, które zaczynają się od 'Data=', mieszczą sie pomiedzy [POLYLINE] ... [END] i dodatkowo parametr 'typ' bedzie posiadal wartosc z okreslonego zbioru (0x5,0x6,0x7,0x8)

Fragment danych na których pracuje wygląda tak:

[POLYLINE]
Type=0x5
Label=Jana Pawła II
EndLevel=2
DirIndicator=1
Data0=(49.56691,20.65598),(49.56694,20.65646)
Plik=src\STARY_SACZ.ulice.txt
[END]

[POLYLINE]
Type=0x6
EndLevel=1
Data0=(49.53458,20.64231),(49.53453,20.64200),(49.53482,20.64113),(49.53493,20.64041)
Plik=src\STARY_SACZ.ulice.txt
[END]

[POI]
Type=0xc00
Label=Osobnica Górna
EndLevel=1
City=Y
Data0=(49.69364,21.38819)
Miasto=Osobnica Górna
Plik=src\cities-NowySacz.pnt
Typ=
[END]

[POLYLINE]
Type=0x7
Data0=(49.53411,20.64284),(49.53371,20.64266),(49.53361,20.64249),(49.53293,20.64228)
Plik=src\STARY_SACZ.ulice.txt
[END]

Nie ukrywam, że jeśli chodzi o programowanie to nie jestem pro :/ chciałbym to zrobic w jak najprostszy sposób

Proszę o pomoc

0

wczytaj sobie do strumienia wejścia zawartość tego całego pliku, później zainicjalizuj z wejścia wektor stringów tymi danymi(istream_iterator). Jeden element wektora będzie równy 1 linijce pliku. Teraz twoim zadaniem będzie wyodrębnienie i wsadzenie do nowego pojemnika wektoru stringów wszystkie dane które zaczynają się od [POLYLINE] do [END]. Pierwszy element tego podciągu będzie zawsze typem(Type = cośtam). Więc wyciągnij z tego elementu liczbę i porównaj ją z zadanym przedziałem. później musisz odszukać element podciągu któy zaczyna się od "Data0".

1
   ifstream plik("dane.txt");
   if(plik)
     {
      string line;
      bool poly=false;
      
      while(plik)
        {
         static const char wiersz[]="Data0=";
         getline(plik,line);
         if(!(line.find("[POLYLINE]"))) poly=true;
         else if(!(line.find("[END]"))) poly=false;
         else if((poly)&&(!line.find(wiersz)))
           {
            line.erase(0,strlen(wiersz));
            cout<<line<<endl;
           }
        }
     }
   else cout <<"Blad otwarcia pliku." << endl;
0

skleciłem coś takiego(kompilator dev):

#include <iostream>
#include <math.h>
#include <string>
#include <list>
#include <conio.h>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <sstream>
using namespace std;
int main()
{
fstream plik;
plik.open("dane.txt");
if(plik.good()) cout << "otwarto plik" << endl;
else cout <<"Blad otwarcia pliku." << endl;

string line;
bool poly=false;

while(plik)
{
static const wiersz[]="\ndata0";
plik.getline(line,'\n');
line="\n"+line;
if(!(line.find("\n[POLILINE]"))) poly=true;
else if(!(line.find("\n[POLILINE]"))) poly=false;
else if((poly)&&(!(line.find(wiersz))))
{
line.eraze(0,strlen(wiersz));
cout<<line<<endl;
}
}
cin.get();
}

ale sypie błedami :(
mógłby mi to ktoś doprowadić do porządku ?? plis

0

Trzeba myśleć a nie czekać na gotowca. Poprawiłem usterki.

0

kurka... musze jeszcze sprawdzac czy 'Type' ma jedną z wartości 0x5,0x6,0x7,0x8

1

Niewielkie przeróbki i będzie sprawdzać. Wystarczy zrozumieć jak to działa i ruszyć głową. Lub zamówić gotowca.

0

wykombinowałem cos takiego:

ifstream plik("dane.txt");
if(plik)
{
string line;
string line_t;
bool poly=false;
bool typ=false;

  while(plik)
    {
     static const char wiersz[]="Data0=";
     static const char wiersz_typ[]="Type=";
     getline(plik,line);
     if(!(line.find("[POLYLINE]"))) poly=true;
     else if (!(line.find("Type="))){ line_t=line.erase(0,strlen(wiersz_typ)); 
                                      if (line_t=="0x5" || line_t=="0x6" || line_t=="0x7" || line_t=="0x8") 
                                      typ=true;
                                     }
     else if(!(line.find("[END]"))) poly=false,typ=false;
     else if((poly)&&(!line.find(wiersz))&&(typ))
       {
        line.erase(0,strlen(wiersz));
        cout<<line<<"*"<<endl;
       }
    }
 }

else cout <<"Blad otwarcia pliku." << endl;

// A czy ta rade jakoś inaczej zapisac to sprawdzanie: if (line_t=="0x5" || line_t=="0x6" || line_t=="0x7" || line_t=="0x8") ??? zeby to lepiej wyglądało, bo zbiór tych wartości bedzie wiekszy

1

static const char *good[]={"0x5","0x6","0x7","0x8"};
const unsigned goodsize=sizeof(good)/sizeof(*good);
for(unsigned i=0;(i<goodsize)&&(typ);++i) if(good[i]==line_t) typ=true;

z tym że radze po znalezieniu "Data0=" zapisać to do zmiennej np streing foundline i ustawiać na true bool dane,
a dopiero po znalezieniu "[END]" przyjmować pod uwagę tą foundline o ile typ jest true oraz dane są true;
zaś typ i dane masz ustawić na false również przy znalezieniu "[POLYLINE]".
Uchroni cie to przed tym że "dane0=" będą przed "type="

zamiast stosować:
poly=false,typ=false;
użyj lepiej klamer lub:
poly=typ=false;

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