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

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

1

10.09.2007, 16:21

Positionsmarken in einer File? Strukturiertes Einlesen ?

Hey ho ,

Schaut euch folgendes mal bitte an

Ich lese ein komplettes Verzeichnis in einen Vektor ein :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
 {
vector<string> v;
ifstream in("FILE");
string line;
while(getline(in, line))
v.push_back(line); 
for(int i =0;i <v.size(); i++)
cout << i << ": " << v[i] << endl;
}


So habe nun folgende Frage :

Wie kann ich eine Marke auf bestimmte Zeilen setzen ? d.h das ich die Funktion oben nicht in main packe und ihr dann als Parameter ein Codewort übergebe das auch in der File steht und ab da soll eingeleen werden bis zu einem neuen Codewort...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Bsp :

//Anfangsmarke 1
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//ENdemarke 1

//Anfangsmarke 2
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//TEXT ,TEXT,TEXT ,TEXT,TEXT ,TEXT
//ENdemarke 2


Ich übergebe der Funktion Anfangsmarke 2 und dann sollen die zeilen ab ANfangsmarke 2 bis Endemarke 2 eingelesen werden und AUsgegeben (Zeile nach Zeile !).. oder halt anfangsmarke 1 bis ende marke 1


Edit : Meine Idee ist das man den Kompletten Vector durchsuchen könnte und dann sagt gib ab da bis da aus .aber immer Zeilenweiße .. nur wie setzt man das um ?

Hatte an sowas gedacht :

Quellcode

1
string::size_type position = v.find( "Anfangsmarke2" );


Ist abba glaub ich FALSCH XD

Hoffe ihr könnt mir helfen

MFG Toa[/code]

2

10.09.2007, 17:38

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
#include <iterator>

void read_block_data(const std::string&, std::size_t, std::vector<std::string>&)

int main()
{
    std::vector<std::string> data;
    read_block_data("test.txt", 2, data);
    std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout << "\n"));
}

void read_block_data(const std::string& filename, std::size_t block, std::vector<std::string>& data)
{
    std::ifstream file(filename.c_str());
    if (!file)
        throw std::invalid_argument("could not open file");
    
    data.clear();
    std::ostringstream ss("// Anfang ");
    ss << std::setw(2) << std::setfill('0') << block;
    std::string start(ss.str());
    ss.str("");
    ss.clear();
    ss << "// Ende " << std::setw(2) << std::setfill('0') << block;
    std::string line;
    bool in_data = false;
    while (std::getline(file, line))
    {
        if (in_data == false && line.find_first_of(start) != std::string::npos)
        {
            in_data = true;
            continue;
        }
        if (in_data == true && line.find_first_of(ss.str()) != std::string::npos)
            in_data = false;
        else
            data.push_back(line);
    }       
}
... selbsterklärend ... aber 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

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

3

10.09.2007, 18:01

Hab ein kleines Problem :

Quellcode

1
std::ostringstream ss("Anfang");


Variable std::ostringstream ss has initializer but incomplete type

:/

Und dann eine Kleine Frage :

Hab ich das richtig verstanden das ss << std::setw(2) DIe Feld länge auf 2 chars setzt ? .. also muss man das so hochsetzen wie man es brauch ...Aber was mach ich wenn ich nicht weiß wie lang Marke 1 - Marke 2 ist und ein anderes Prob ist das man ja anfangs und endpunkt festlegen muss , dann sucht er aber doch immer nach den selben Punkten ... oder ?

4

10.09.2007, 20:33

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string> // std::string; std::getline

#include <iostream> // std::cin, std::cout

#include <fstream> // std::ifstream

#include <vector> // std::vector

#include <iomanip> // std::setw, std::setfill

#include <iterator> // std::ostream_iterator

#include <sstream> // sry hatte ich vergessen 


void read_block_data(const std::string&, std::size_t, std::vector<std::string>&)

int main()
{
    std::vector<std::string> data;
    read_block_data("test.txt", 2, data);
    std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout << "\n"));
}

void read_block_data(const std::string& filename, std::size_t block, std::vector<std::string>& data)
{
    std::ifstream file(filename.c_str());
    if (!file)
        throw std::invalid_argument("could not open file");
   
    data.clear(); // falls daten im übergebenen Vektor => löschen!

    std::ostringstream ss("// Anfang "); // Im Buffer von ss steht jetzt "// Anfang " ...

    ss << std::setw(2) << std::setfill('0') << block; // das folgende (block) soll 2(setw) Zeichen lang sein => ansonnsten mit (setfill) '0' auffüllen.

    std::string start(ss.str()); // was im Buffer von ss steht in start packen ...

    ss.str(""); // ss zurücksetzen

    ss.clear();
    ss << "// Ende " << std::setw(2) << std::setfill('0') << block; // das selbe wie mit // Anfang

    std::string line;
    bool in_data = false;
    while (std::getline(file, line))
    {
        if (in_data == false && line.find_first_of(start) != std::string::npos)
        {
            in_data = true;
            continue;
        }
        if (in_data == true && line.find_first_of(ss.str()) != std::string::npos)
            in_data = false;
        else
            data.push_back(line);
    }       
}
und das nicht kommentierte erklärt sich jetzt aber echt von selbst -.-
Und die Datei sähe dann für den Beispielcode z.B. wie folgt aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
// Anfang 01
var_visible = true;
var_show = false;
// Ende 01
// Anfang 02
var_visible = false;
var_show = true;
// Ende 02
// Anfang 03
var_visible = false;
var_show = false;
// Ende 03
...
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

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

5

10.09.2007, 20:45

Oki , jetzt kommen keine COmpilier fehler mehr nur jetzt liest er nichts ein wenn ich oben in mein cout << data[1]; ausgeben lasse stürtzt die Konsole ab damit signalisiert sie mir das in data[1] nicht drin steht , meine FIle sieht genau wie deine aus :/ ... das Problem ist das ich mich mit iteration nicht so gut auskenne :/ weiß du wo der Fehler ist ?

6

10.09.2007, 20:52

Ehm ok sorry war nen Fehler drin ... hatte die falsche suchfunktion genommen ... den stream falsch genutzt usw ^^

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string> // std::string; std::getline

#include <iostream> // std::cin, std::cout

#include <fstream> // std::ifstream

#include <vector> // std::vector

#include <iomanip> // std::setw, std::setfill

#include <iterator> // std::ostream_iterator

#include <sstream> // sry hatte ich vergessen


void read_block_data(const std::string&, std::size_t, std::vector<std::string>&);

int main()
{
    std::vector<std::string> data;
    read_block_data("test.txt", 2, data);
    std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}

void read_block_data(const std::string& filename, std::size_t block, std::vector<std::string>& data)
{
    std::ifstream file(filename.c_str());
    if (!file)
        throw std::invalid_argument("could not open file");
   
    data.clear();
    std::ostringstream ss;
    ss << "// Anfang " << std::setw(2) << std::setfill('0') << block;
    std::string start(ss.str());
    ss.str("");
    ss.clear();
    ss << "// Ende " << std::setw(2) << std::setfill('0') << block;
    std::string line;
    bool in_data = false;
    while (std::getline(file, line))
    {
        if (in_data == false && line.find(start) != std::string::npos)
            in_data = true;
        else if (in_data == true)
        {
            if (line.find(ss.str()) != std::string::npos)
                in_data = false;
            else
                data.push_back(line);
        }
    }       
}
... das geht aber :D
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

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

7

10.09.2007, 20:57

Juhu Big Thx .. jetzt habsch noch eine Frage

Also nach jeder Zeile soll eine Funktion aufgerufen werden und dann erst die nächste zeile ausgegeben werden wie mach ich das ?Nur das Problem ist das nach jeder Zeile der Funktion andere Werte übergeben werden müssen haste ne Idee wie man das lösst kann man die werte auch in die FIle schreiben ?(Parameter : sleep_stepped(3800,800, VK_SPACE); als beispiel ) ... und ist es möglich die txt als binary einzulesen und auch irgendwie zu codieren ..also ich muss ja in die txt reinschreiben und danach will ich sie binary haben geht sowas ?

Edit : Und ich hab noch ein Problem :

Meine DIaloge sehen so aus :

colorcout('3',wPlayer->name);
cout << "Wo bin ich denn hier gelandet?\n"
sleep_stepped(2200,800, VK_SPACE);

den Text kann man ja aus FIle auslesen aber wie mache ich das mit den beiden funktionen die untere dürfte kein problem sein die macht nichts weiter bewegendes abba oben wird ja ein element von einem Object gedisplayed und dieses dann eingefährt weißt du wie ich das alles durch eine txt geregelt bekomme oder ist das am ende zu umständlich

8

10.09.2007, 21:33

Du willst also sozusagen dir eine eigene Scriptsprache entwickeln? Boost::Gramatik erstellen ^^
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

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

9

10.09.2007, 21:58

Jaein , es ist so das die Dialoge die ich habe sehr viel Platz im QUellcode wegnehmen , und diese leider nicht nur aus Texten sondern zwischen drin auch funktionen die zb soundaktivieren bestehen. Deshalb dachte ich mir, man kann das alles über eine Textfile regeln . Aber so wie ich sehe wird das viel zu umständlich. Ich denke ma ich nutze das aus Txt lesen in gewissen abschnitten als Questgeber , da bleibt nur noch eine Frage wie kann ich über die txt funktionen aufrufen geht das :

Weil nun stelle ich mir das so vor :

Ich habe eine Txt , diese besteht aus mehreren Quests zu jedem Quest gehört eine FUnktion Sprich:

Anfang01
Quest-Aufgabe : bla bla bla
Questfunktion();
Ende01

usw

Ist das Realisierbar , oder hast du eine bessere IDee für ein Questsystem ? Weil zuerst wollte ich die Ganze Technis ja für den ersatz der DIaloge nutzen damit die nicht merh so viel Platz im QUellcode verbrauchen :/ aber es wird von mal zu mal umständlicher ....


MFG Toa

10

10.09.2007, 23:02

Ehm nunja ... ich glaube nicht das du schon sonderlich erfahren bist im Programmieren ... deswegen ist das für dich relativ umständlich ... an sonnten kann man das, was du machen wolltest(als 1.) doch relativ leicht umsetzten ... du musst halt für einen bestimmten String eine Funktion hinterlegen(std::map<std::string, FuncPtr>) ... dann musst du nur gucken wegen dem FuncPtr ob du das hinbekommst ... also isn bissel parse-Arbeit ... wenn du willst kannst de mich aber mal bei ICQ ansprechen und dann helf ich dir nen bissel dabei das zu realisieren ... ist nicht sooo schwer ...
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