C++ Variable in einer if-Bedingung
-
Ich brauch erneut Eure Hilfe. Da es sich um ein etwas anderes Thema handelt, habe ich mich entschlossen einen anderen Thread zu machen. Wie auch immer, hier ist ein Abschnitt meines Programms um das Problem besser zu erklären.
int ID; cin >> ID; if (s="<SchuelerId>"ID"</SchuelerId>") cout << "Hallo Welt;In der Datei gibt es viele Schüler-Identifikationsnummern
z.B
<SchuelerId>20038</SchuelerId>
Der User soll die Schüler-ID-Nummer eingeben und das Programm gibt ihm die Informationen zum jeweiligen Schüler aus. Wie kriege ich es hin?
Es handelt sich also nicht um eine reine Zahl, sondern besteht aus Zahlen und Wörtern. Ich möchte auch nicht, dass der User diese Wörter eingeben muss.Gruß
-
1. Was hat das mit MFC zu tun?
2. Was willst du mit dieser if-Bedingung erreichen?
3. Schon mal überlegt ein Buch über C++ durchzulesen?
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
sen83 schrieb:
Wie kriege ich es hin?
Mit einem XML-Parser und C++-Buch. Da du aber für das Erstere noch nicht soweit bist, fang lieber mit einem Buch an. Wenn aber die Zeit drängt, du wenig/keine Lust hast, C++ anständig zu lernen, und dir ein Tunnelblick ausreicht, dann schau dir gleich I/O in C++ und std::string (Stichwort find()) an.
Dir einen fertigen Programmcode zu posten, würde bei deinen C++-Kenntnissen keinen Sinn machen.
-
sen83 schrieb:
if (s="<SchuelerId>"ID"</SchuelerId>")Bevor du noch öfter drauf 'reinfällst: der Vergleichsoperator in C++ ist "==", nicht "=". Du versuchst hier, die Adresse eines Stringliterals zuzuweisen. Und so ein Vergleich klappt dann auch nur, wenn du eine String-Klasse wie std::string verwendest. Mit char-Arrays geht das so nicht (da gäbe es z.B. strncmp). Wir sehen ja leider nicht, welchen Typ s hat. Und das Zusammenfriemeln von Strings und ints geht auch nicht einfach, indem man sie hintereinander schreibt...
-
Hallo sen83,
aus Deiner Fragestellung und dem vorhergegangenen Thread schließe ich, dass Du die XML-Datei nicht wirklich einlesen kannst. Mit 'wirklich einlesen' meine ich, dass ein Wert wie 20038 der zwischen zwei XML-tags steht, letztlich in eine Variable Deines Programms wandert (int oder string). Mit zeilenweisen Einlesen via getline kommst Du bei einer XML-Datei wirklich nicht weiter.
Da da auch kein Tool benutzen sollst (hier würde sich tinyxml anbieten), würde ich Dir empfehlen mit einem 'Minimalparser' nach z.B.: <SchuelerId> zu suchen. Das ganze könnte so aussehen:
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <fstream> #include <limits> // -- Minimalparser für einen XML-tag '<Text>' struct search_xml_tag { search_xml_tag( const std::string& tag ) : tag_( tag ) {} std::string tag_; }; std::istream& operator>>( std::istream& in, search_xml_tag s ) { for( std::string tag; in.ignore( std::numeric_limits< std::streamsize >::max(), '<' ).good() && getline( in, tag, '>' ) && tag != s.tag_; ) ; return in; } int main() { using namespace std; vector< int > schuelerIds; { // -- alle Schüler-Ids nach 'schuelerIds' lesen ifstream in("input.xml"); if( !in.is_open() ) { cerr << "Fehler beim Oeffnen der Datei" << endl; return -2; } for( int id; in >> search_xml_tag( "SchuelerId" ) >> id; ) schuelerIds.push_back( id ); cout << schuelerIds.size() << " Eintraege gelesen" << endl; } for( int id; cout << "\nBitte SchuelerId eingeben (Ende mit 'q'): ", cin >> id; ) { cout << "Die SchuelerId " << id << " ist " << (any_of( begin(schuelerIds), end(schuelerIds), [id]( const int& x ) { return x == id; } )? "in der Datei enthalten": "unbekannt") << endl; } return 0; }Da dürfen dann z.B. keine Attribute in dem XML-Tag stehen, aber das ist die einfachste Variante, die ich mir in der Form vorstellen kann.
Gruß
Werner
-
Ganz kleine Bitte: könntest du den Code-Tag richtig stellen? Das in die ganze Zeit gehilighted wird, verwirrt ein wenig... wollte schon zum Forentechnik-Board marschieren
