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

SPF

Frischling

  • Private Nachricht senden

41

16.09.2007, 19:45

Hallo!

Ich bin jetzt nach einiger Recherche im Internet auf diesen Thread gestoßen, der genau mein Problem behandelt. Ich hab den Code gleich ausprobiert, funktioniert auch toll, nur möchte ich den Teil, der die Antworten einliest so ändern, dass das Trennzeichen kein " " ist sondern ein ";". Ich hab mir schon einen Thread weiter oben angesehen, nur komm ich nicht drauf, wie ich den oberen Thread mit dem hier verbinde. Wäre sehr nett, wenn sich jemand meinem Problem annehmen könnte.

P.S.: Mit " " ist das Leerzeichen gemeint.

42

16.09.2007, 20:24

ehm sollte nicht mit iteratoren ohne weiteres möglichsein ... es sei denn du definierst dir nen eigenen typen dafür:

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
template<typename T, const char it = ';'>
struct help_stream_iterator 
{
public:
    friend std::istream& operator>>(std::istream& in, help_stream_iterator & obj)
    {    
        std::string tmp;
        if (!std::getline(in, tmp, it)){ in.setstate(std::ios_base::failbit); return in; }
        std::istringstream ss(tmp);
        ss >> obj.m_data;
        if (!ss) in.setstate(std::ios_base::failbit); 
        return in;
    }
    friend std::ostream& operator<<(std::ostream& out, const help_stream_iterator & obj)
    {    
        out << obj.data();
        return out;
    }

public:
    T const&    data() const { return m_data; }

private:
    T m_data;
};


C-/C++-Quelltext

1
2
std::vector <help_stream_iterator> answers;
std::copy(std::istream_iterator<help_stream_iterator<std::string> >(file_stream), std::istream_iterator<help_stream_iterator <std::string> >(),  std::back_inserter( answers) );

Da der Stream-Operator << auch überladen ist, ist auch das mit dem std::ostream_iterator möglich ... hf mit dem kram ;)
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

SPF

Frischling

  • Private Nachricht senden

43

16.09.2007, 21:26

Ich habe jetzt deinen Code verwendet und den unteren Teil ersetzt. Da es gleich ein paar Fehler gab, habe ich auch die Datei Iterator inkludiert. Ich benutze, wie der Ersteller des Threads Dev-C++ und das Programm hat mir vorgeschlagen, dass ich stl_iterator.h einbinden sollte, also es hat mir eine Hilfedatei dazu gezeigt. Kann es sein, dass ich etwas übersehen habe?
Insgesamt gibt es 24 Fehler beim Kompilieren. :(

44

16.09.2007, 22:22

Also für den Code brauchst du die Header:

C-/C++-Quelltext

1
2
3
4
5
6
#include <algorithm> // std::copy

#include <vector> // std::vector

#include <string> // std::string, std::getline

#include <istream> // std::istream

#include <sstream> // std::istringstream

#include <iterator> // std::ostream_iterator, std::istream_iterator
... das sollten eigentlich alle Header sein ... kann aber sein, dass ich einen vergessen habe. istream müsste man eigentlich auch weglassen können weil sstream den schon einbindet, da std::istringstream auf std::istream basiert.
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

SPF

Frischling

  • Private Nachricht senden

45

17.09.2007, 13:22

Der Code sollte jetzt so aussehen, oder?

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "LB1.hpp"
#include <algorithm> // std::copy

#include <vector> // std::vector

#include <string> // std::string, std::getline

#include <istream> // std::istream

#include <sstream> // std::istringstream

#include <iterator> // std::ostream_iterator, std::istream_iterator

#include <fstream>
#include <iostream>


template<typename T, const char it = ';'>
struct help_stream_iterator
{
public:
    friend std::istream& operator>>(std::istream& in, help_stream_iterator & obj)
    {   
        std::string tmp;
        if (!std::getline(in, tmp, it)){ in.setstate(std::ios_base::failbit); return in; }
        std::istringstream ss(tmp);
        ss >> obj.m_data;
        if (!ss) in.setstate(std::ios_base::failbit);
        return in;
    }
    friend std::ostream& operator<<(std::ostream& out, const help_stream_iterator & obj)
    {   
        out << obj.data();
        return out;
    }

public:
    T const&    data() const { return m_data; }

private:
    T m_data;
};

void LB1L1()
{
     std::ifstream file_stream("Data\\questionLB1L1.qst");
    std::vector<std::string> questions;
    std::string temp_line;
    while (std::getline(file_stream, temp_line)) questions.push_back(temp_line);
    file_stream.close();
    file_stream.clear();

    file_stream.open("Data\\answerLB1L1.qst");
    std::vector <help_stream_iterator> answers;
std::copy(std::istream_iterator<help_stream_iterator<std::string> >(file_stream), std::istream_iterator<help_stream_iterator <std::string> >(),  std::back_inserter( answers) );
    file_stream.close();

    std::srand(static_cast<unsigned int>(std::time(0)));
   
    bool close = false;
    while (close == false)
    {
        std::cout    << "\t (0) Neue Frage\n"
                    << "\t (1) Zurueck" << std::endl;
        std::cout << "\t";
        while (!(std::cin >> close)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
        if (close == false)
        {
            std::cout << "\n";
            std::size_t pos = std::rand() % std::min(questions.size(), answers.size());
            std::cout << "\t";
            std::cout << questions.at(pos) << std::endl;
            std::string answer;
            std::cout << "\t";
            std::cin >> answer;
            std::cout << "\n" << "\t";
            std::cout << "Die Antwort ist " << (answers.at(pos) == answer ? "richtig!" : "falsch!") << std::endl;
            std::cout << "\n\n";
        }
    }
}


Aber es kommen folgene Fehler:

Zitat von »"KompilerLog"«

Compiler: Default compiler
Building Makefile: "C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Projekt 1\Makefile.win"
Führt make... aus
make.exe -f "C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Projekt 1\Makefile.win" all
g++.exe -c LB1L1.cpp -o LB1L1.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

LB1L1.cpp: In function `void LB1L1()':
LB1L1.cpp:48: error: type/value mismatch at argument 1 in template parameter list for `template<class _Tp, class _Alloc> class std::vector'
LB1L1.cpp:48: error: expected a type, got `help_stream_iterator'
LB1L1.cpp:48: error: template argument 2 is invalid
LB1L1.cpp:48: error: invalid type in declaration before ';' token

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h: At global scope:
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h: In instantiation of `std::back_insert_iterator<int>':
LB1L1.cpp:49: instantiated from here
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:363: error: `int' is not a class, struct, or union type

LB1L1.cpp: In function `void LB1L1()':
LB1L1.cpp:64: error: `size' has not been declared
LB1L1.cpp:64: error: request for member of non-aggregate type before '(' token

LB1L1.cpp:71: error: `at' has not been declared
LB1L1.cpp:71: error: request for member of non-aggregate type before '(' token

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algobase.h: In function `_OutputIterator std::__copy(_InputIterator, _InputIterator, _OutputIterator, std::input_iterator_tag) [with _InputIterator = std::istream_iterator<help_stream_iterator<std::string, ';'>, char, std::char_traits<char>, ptrdiff_t>, _OutputIterator = std::back_insert_iterator<int>]':
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algobase.h:266: instantiated from `_OutputIterator std::__copy_aux2(_InputIterator, _InputIterator, _OutputIterator, __false_type) [with _InputIterator = std::istream_iterator<help_stream_iterator<std::string, ';'>, char, std::char_traits<char>, ptrdiff_t>, _OutputIterator = std::back_insert_iterator<int>]'
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algobase.h:308: instantiated from `_OutputIterator std::__copy_ni2(_InputIterator, _InputIterator, _OutputIterator, __false_type) [with _InputIterator = std::istream_iterator<help_stream_iterator<std::string, ';'>, char, std::char_traits<char>, ptrdiff_t>, _OutputIterator = std::back_insert_iterator<int>]'
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algobase.h:327: instantiated from `_OutputIterator std::__copy_ni1(_InputIterator, _InputIterator, _OutputIterator, __false_type) [with _InputIterator = std::istream_iterator<help_stream_iterator<std::string, ';'>, char, std::char_traits<char>, ptrdiff_t>, _OutputIterator = std::back_insert_iterator<int>]'
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algobase.h:358: instantiated from `_OutputIterator std::copy(_InputIterator, _InputIterator, _OutputIterator) [with _InputIterator = std::istream_iterator<help_stream_iterator<std::string, ';'>, char, std::char_traits<char>, ptrdiff_t>, _OutputIterator = std::back_insert_iterator<int>]'
LB1L1.cpp:49: instantiated from here
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algobase.h:234: error: no match for 'operator=' in '(&__result)->std::back_insert_iterator<_Container>::operator* [with _Container = int]() = (&__first)->std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::operator* [with _Tp = help_stream_iterator<std::string, ';'>, _CharT = char, _Traits = std::char_traits<char>, _Dist = ptrdiff_t]()'
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:338: note: candidates are: std::back_insert_iterator<int>& std::back_insert_iterator<int>::operator=(const std::back_insert_iterator<int>&)

make.exe: *** [LB1L1.o] Error 1

Ausführung beendet

46

17.09.2007, 13:55

ehm tjo das kommt davon wenn man nicht versteht was da abgeht sondenr einfach nur kopiert ^^

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <algorithm> // std::copy

#include <vector> // std::vector

#include <string> // std::string, std::getline

#include <istream> // std::istream

#include <sstream> // std::istringstream

#include <iterator> // std::ostream_iterator, std::istream_iterator

#include <fstream> // std::ifstream

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

#include <ctime> // std::time

#include <cstdlib> // std::srand, std::rand


template<typename T, const char it = ';'>
struct help_stream_iterator
{
public:
    friend std::istream& operator>>(std::istream& in, help_stream_iterator & obj)
    {   
        std::string tmp;
        if (!std::getline(in, tmp, it)){ in.setstate(std::ios_base::failbit); return in; }
        std::istringstream ss(tmp);
        ss >> obj.m_data;
        if (!ss) in.setstate(std::ios_base::failbit);
        return in;
    }
    friend std::ostream& operator<<(std::ostream& out, const help_stream_iterator & obj)
    {   
        out << obj.data();
        return out;
    }
    operator T const&() const { return m_data; }

public:
    T const&    data() const { return m_data; }

private:
    T m_data;
};

int main()
{
    std::ifstream file_stream("Data\\questionLB1L1.qst");
    if (!file_stream)
    {
        std::cerr << "FEHLER: Die Programmdateien sind beschädigt! (0x000001)" << std::endl;
        return -1;
    }
    std::vector< help_stream_iterator<std::string, '\n'>> questions;
    std::copy(std::istream_iterator<help_stream_iterator<std::string, '\n'> >(file_stream), std::istream_iterator<help_stream_iterator<std::string, '\n'> >(),  std::back_inserter(questions));

    file_stream.close();
    file_stream.clear();

    file_stream.open("Data\\answerLB1L1.qst");
    if (!file_stream)
    {
        std::cerr << "FEHLER: Die Programmdateien sind beschädigt! (0x000002)" << std::endl;
        return -1;
    }
    std::vector< help_stream_iterator<std::string, ';'> > answers;
    std::copy(std::istream_iterator<help_stream_iterator<std::string, ';'> >(file_stream), std::istream_iterator<help_stream_iterator<std::string, ';'> >(),  std::back_inserter(answers));

    std::srand(static_cast<unsigned int>(std::time(0)));
   
    bool close = false;
    while (close == false)
    {
        std::cout << "\t(0) Neue Frage\n"
                  << "\t(1) Beenden\n\t" << std::flush;
        while (!(std::cin >> close)) { std::cin.sync(); std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
        if (close == false)
        {
            std::size_t pos = std::rand() % std::min<std::size_t>(questions.size(), answers.size());
            std::cout << "\n\t" << questions.at(pos) << "\n\t" << std::flush;
            std::string answer;
            std::cin >> answer;
            std::cout << "\n\tDie Antwort ist " << (answers.at(pos).data() == answer ? "richtig!" : "falsch!") << "\n\n" << std::endl;
        }
    }
}
sollte gehen ... ist aber nicht getestet ...

Bearbeitung
1. Ich hatte übersehen, das du da noch Formatierung ('\t', '\n', usw.) eingebaut hattest. Hab es jetzt dementsprechend angepasst.
2. Man kann das Template natürlich auch für das Einlesen von den Fragen nutzen. Statt ';' nimmt man jetzt aber als "Trenner" ein Newline-Zeichen('\n').
3. operator T const&() const der Struktur hinzugefügt. (cast-Operator)
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

SPF

Frischling

  • Private Nachricht senden

47

17.09.2007, 14:37

Dank dir für den Code.

Es ist aber noch kein Meister vom Himmel gefallen. ;)

48

17.09.2007, 14:43

Ja ok, das du nicht direkt auf so ne struct wie "help_stream_iterator" kommst, das ist klar... aber naja. Guck dich mal ein wenig bei Templates in C++ um :) Ist manchmal echt praktisch ^^
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

49

17.09.2007, 14:51

So hab da oben noch etwas angepasst. Was genau kannst du bei "Edit" lesen.
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