Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.04.2008, 12:55

Schwerer Parser! [C++]

Also liebe Community ich sitz vor einem rätsel und wer das hin bekommt
hat wirklich meinen respekt!

Also wir haben die Variablen:
int Len = 0;
BYTE Data[];
long Adress;

und zwar möchte ich:

Zitat

// W-Tie
//
Bytes=3
0x62,0x34,0x85
Adress=0x230201
//
Bytes=3
0x53,0x23,082
Adress=0x230201

ein parsen das heißt // wird ignoriert und
Len = sollte z.b 3 sein
und Data[] sollte den inhalt 0x.... haben.
Und Adress eben den Adress wert nach dem komma.

Vll schafft das ja einer ich wär sehr dankbar
gruß mapa

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

19.04.2008, 13:38

Mach das doch Token für Token. Wenn die Reihenfolge immer die gleiche ist, ist das ganz einfach. Dann liest du das einfach ein und lässt das Weg, was dich nicht interessiert.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

19.04.2008, 15:34

Am einfachsten mit wcstok_s. Alternativ kannst du dir mal RegEx anschauen. Ist zwar schon fast eine Sprache für sich, aber auch sehr mächtig beim Einlesen. Boost bietet dafür glaube ich sogar eine C++Lib an.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

4

19.04.2008, 21:39

Schweres Geschütz: Spirit.
Sonst kannst du es so machen:
Zeile einlesen (std::getline),
auf '//' durchsuchen. Danach alles wegschneiden.
Dann hast du ja ein normales muster ...
einfach am besten sowas wie:

C-/C++-Quelltext

1
2
3
4
5
6
struct array_data
{
    std::size_t size;
    unsigned char* data;
    unsigned long address;
};
dazu dann operator<< und operator>> überlaen und fertig... das ist nicht schwer!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct array_data
{
    std::size_t size;
    unsigned char* data;
    unsigned long address;

    array_data()
        : size(0U), data(NULL), address(0UL)
    {}
    ~array_data()
    { delete [] data; }
    friend std::istream& operator>>(std::istream& in, array_data& data)
    { 
        std::string temp;
        std::getline(in, temp, '=');
        in.ignore() >> data.size;
        data.data = new unsigned char[size];
        for (std::size_t i(0); i < data.size; ++i)
            (in >> data.data[i]).ignore();
        std::getline(in, temp, '=');
        in.ignore() >> data.address;
    }
    friend std::ostream& operator<<(std::ostream& out, array_data const& data)
    { 
        out << "Bytes=" << data.size << "\n"; 
        for (std::size_t i(0); i < (data.size - 1); ++i) out << data.data[i] << ",";
        return out << data[data.size - 1] << "Adress=" << data.address;
};
und fertig -.-

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
std::ifstream file_stream("sample.txt");
if (!file_stream) throw std::runtime_error("could not find file");

std::vector<array_data> data;

char is_comment[3];
while (file_stream >> is_comment)
{
    if (std::strcmp(is_comment, "\\\\") == 0) continue;
    data.push_back(array_data());
    ((file_stream.putback('\\')).putback('\\')) >> data[data.size() - 1];
}
fertig is das Einlesen ;)

Achja... nicht hauen wenn nen Fehler drin ist :D Habs nicht getestet ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige