Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » von spezieller Txt-datei in variablen einlesen und verarbeiten?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.06.2007, 14:26 Uhr
sten



Hallo ich habe folgende Txt-datei -struktur "Datei.txt"

Code:

:Tom
100
0
!kein Inventar
:Joe
120
12
#Pizza
10
6
:Jens
150
2
*Pistole
10
1
#Milch
10
1
:Thomas
80
1
*Pistole
10
1

erläuterung
Am beispiel Jens:
:Jens -> string Playername
150-> int maxGewicht
2 -> int aktuellesGewicht
#Milch -> Item, bzw Nahrung erkennbar an # d.h. falls # soll es als nahrung abgelegt werden bei * als Waffe...
10 -> Nahrungsvalue
1 -> Nahrungsgewicht
*Pistole-> Item , bzw Waffe erkennbar an *
10-> Waffenvalue
1-> Waffengewicht

jetzt der nächste Player erkennbar am ":".

ich habe eine Klasse Player und eine abstakte Klasse Item mit zwei Unterklassen namens Nahrung und Waffen.
weiterhin habe ich einen Vector angelegt bei main() bei dem die Playerobjekte abgespeichert werden. Unter anderem (s.u.) ein attribut in Klasse Player , eine std:list bei dem dann die Items (Waffe u. Nahrung) abgelegt werden. weitere attribute der klasse Player sind int maxGewicht und int aktuellesGewicht und string playerName.
so nun möchte ich natürlich die einzelnen attribute von der Txtdatei in den vector abspeichern .
ich habe mir folgendes gedacht.
habe variablen in main angelegt :
string playername; int maxGew; int aktuellesGew; //(sind attribute von Kl. Player)
und weiter.
string nahrungName, int nahrungValue, int nahrungGewicht //sind attribute von Kl. Nahrung
string waffenName, int waffenValue, int waffenGewicht. //sind attribute von Kl. Waffen

das problem wie schaffe ich es, das in die einzelnen attribute alles richtig abgespeichert wird. Problem beispielsweise ist #Milch muss in attribut nahrungsname und die darauffolgenden ints natürlich in die nahrungsValue und nahrungsGewicht. und *Pistole in attribut waffenName etc..
Die Dateistruktur ist natürlich variable d.h. bei einem Spieler ist z.b. keine Nahrung oder Waffe vorhanden bei anderen schon oder mehrere Waffen und Nahrung.

nun also...wie kann ich das richtig einlesen? jedes einzelne Objekt dann mit push_back in vector ablegen aber da muss ich zuerst die datei auseinander frimeln und richtig ablegen. hmmm?
wie sieht das codemässig in etwa aus? , wäre für eure hilfe dankbar.


gruss Sten



(ps.falls das jetzt zu abstrakt beschrieben war kann ich die ein oder andere Header später noch posten)

Dieser Post wurde am 28.06.2007 um 14:31 Uhr von sten editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.06.2007, 18:28 Uhr
Karldin Shinowa
Professional Noob


also stelle mir das ca so vor

C++:
class Player
{
   string playername;
   int maxGev;
   int aktuellesGev;

   list<Item*> items;

   public:
      Player(string playername,int maxGev,int aktuellesGev){..}

      void addNahrung(int value, int gewicht)
      {
           items.push_back(new Waffe(value,gewicht);
      }

      void addWaffe(int value,int gewicht){...}
};

void newPlayer(string name);
void newNahrung(string name);
void newWaffe(string name);

fstream file;
vector<Player*>players;
int main()
{
  
  file.open("config.txt",ios::in);
  string buffer;

  getline(file,buffer);
  newPlayer(buffer.substr(1,buffer.length()-1));


}

void newPlayer(string name)
{
   int gewicht,maxgewicht;
   string buffer;

   gewicht= atoi(getline(file,buffer));
   maxgewicht=atoi(getline(file,buffer));
   players.push_back(new Player(name,gewicht,maxgewicht));
  

   while(true)
   {
      if(file.eof()) break;
      getline(file,buffer);
      if(buffer.find(':',0)) newPlayer(buffer.substr(1,buffer.length()-1));
      if(buffer.find('!',0)continue;
      if(buffer.find('#',0) newNahrung(buffer.substr(1,buffer.length()-1));
      if(buffer.find('*',0) newWaffe(buffer.substr(1,buffer.length()-1));
   }
   return;
}

void newNahrung(string name)
{
  int value,gewicht;
  value= atoi(getline(file,buffer));
  gewicht=atoi(getline(file,buffer));
  //Pseudo: player.last.addNahrung(name,value,gewicht);
  return;
}



Nur schnell hingefetzt hatte nicht mehr Zeit(ein paar konstruktor parameter vertauscht).
Mfg
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 28.06.2007 um 18:31 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.06.2007, 00:49 Uhr
sten



das klappt nicht so ganz weil atoi keine strings direkt umwandeln kann aber danke schon mal hab nee andere version mit istringstreams ziemlich kompliziert das ganze.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.06.2007, 01:23 Uhr
sten



die Klassen existieren alle schon
d.h.
also das sollte alles in der main passieren
die zuweisung der in der txt-datei vorhandenen daten in die verschiedenen attribute

ich würde einfach dann in der main die attribute weitergeben sequenziell.

in der art

C++:
Player Players(playername, maxGewicht , aktuellesgewicht);
playerVector.push_back(Players);



und wenn ich anderen attribute hätte dann


C++:
Item *pItem= new Weapon(waffenname,waffenvalue,waffgewicht);



dannach um eben das item dem richtigen spieler zuzuweisen die
forschleife...

C++:
for (std::vector< Player >::iterator location=playerVector.begin(); location!=playerVector.end(); location++)
{
   if (location->getName()==playername)
    {                        cout<<"\ndem Spieler ["<<playername<<"] wurde";
    location->addItem(*pItem);
    exist=true;
    }
}


brauch aber halt das sortiert in die attribute nur wie?

Dieser Post wurde am 29.06.2007 um 01:43 Uhr von sten editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.06.2007, 16:19 Uhr
Karldin Shinowa
Professional Noob


Kleine Sache vorweg(Rest kommt noch). Mein Fehler:
atoi erwartet einen c-String und keinen stl-string und c_str wandelt dir das um.
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 29.06.2007 um 17:10 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.06.2007, 17:08 Uhr
Karldin Shinowa
Professional Noob



C++:
#include<string>
#include<iostream>
#include<fstream>
#include<vector>
#include<list>
using namespace std;

class Item
{
   protected:
     string name;
     int value;
     int weight;
    
   public:
      Item(string name,int value,int weight)
      :name(name),value(value),weight(weight)
      {}

      virtual string getType()const =0;
};

class Weapon:public Item
{
   public:
      Weapon(string name,int value,int weight)
      :Item(name,value,weight)
      {}
      
      string getType() const
      {
         return "Weapon";
      }
};

class Food:public Item
{
   public:
      Food(string name,int value,int weight)
      :Item(name,value,weight)
      {}
      
      string getType() const
      {
         return "Food";
      }
};



class Player
{
   string playername;
   int maxWeight;
   int curWeight;

   list<Item*> items;

   public:
      Player(string playername,int maxWeight,int curWeight)
      :playername(playername),maxWeight(maxWeight),curWeight(curWeight)
      {}

      void addFood(string name,int value, int weight)
      {
           items.push_back(new Food(name,value,weight));
      }

      void addWeapon(string name,int value,int weight)
      {
         items.push_back(new Weapon(name,value,weight));
      }
};
//////////////////////////////////////

class ReadConfigs
{
   private:
      fstream file;
      vector<Player*>players;
      string buffer;

   public:
      void newPlayer(string name)
      {
         int curWeight,maxWeight;
        
            getline(file,buffer);
         curWeight=atoi(buffer.c_str());
            
         getline(file,buffer);
         maxWeight=atoi(buffer.c_str());

         players.push_back(new Player(name,maxWeight,curWeight));
  
         while(true)
         {
            if(file.eof()) break;
            getline(file,buffer);
            if(buffer.find(':',0)) newPlayer(buffer.substr(1,buffer.length()-1));
            if(buffer.find('!',0))continue;
            if(buffer.find('#',0)) newFood(buffer.substr(1,buffer.length()-1));
            if(buffer.find('*',0)) newWeapon(buffer.substr(1,buffer.length()-1));
         }
         return;
      }

      void newFood(string name)
      {
         int value,weight;

         getline(file,buffer);
         value= atoi(buffer.c_str());

         getline(file,buffer);
         weight=atoi(buffer.c_str());

         players.back()->addFood(name,value,weight);
         return;
      }
      void newWeapon(string name)
      {
         int value,weight;

         getline(file,buffer);
         value= atoi(buffer.c_str());

         getline(file,buffer);
         weight=atoi(buffer.c_str());

         players.back()->addWeapon(name,value,weight);
         return;
      }
  
   public:
      vector<Player*> read(string filename)
      {
          file.open("config.txt",ios::in);
          getline(file,buffer);
          newPlayer(buffer.substr(1,buffer.length()-1));
          return players;
      }
};

int main()
{
  ReadConfigs* reader=new ReadConfigs;
  vector<Player*>players=reader->read("configs.txt");
  delete reader;
}



Wäre mein Vorschlag das ganze zu regeln. Syntaxfehler sin schon raus genommen :-)
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 29.06.2007 um 17:09 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: