Avatar billede bjering Nybegynder
01. oktober 2004 - 00:30 Der er 11 kommentarer og
1 løsning

list, kan godt smide i, men hvordan henter jeg ud ?

har den her code (parser.h):

#include <list>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

struct server_info
{
  string name;
  const char * ip;
};

struct server_parser: public list<server_info>
{
  server_parser(HWND hdwnd, string file_name);
};

server_parser::server_parser(HWND hdwnd, string file_name)
{
  ifstream file(file_name.c_str());
  char temp[1024];

  if(!file.is_open())
      return;
  while(file.good())
  {
      // If # at the beggining of a line, ignore the line
      if(file.peek()=='#')
        while(file.get()!='\n');
      if(file.good())
      {
        server_info info;
        file.getline(temp,1023,'=');
        info.name=temp;
        file.getline(temp,1023);
        info.ip=temp;
        push_back(info);
      }
  }
}

får min data ud sådan her (i min server.cpp fil):
server_parser sp(hMainWnd, "network.ini");

min data fil (network.ini):
# sets up network.
# this will bind all servers to this ip.
serverip=127.0.0.1

jeg ved så ikke helt, hvordan skal jeg hente ud fra den, f.eks
serverip.

kan det være noget med get_Allocator()? jeg har læst lidt på
http://www.cppreference.com/cpplist.html men fandt ikke lige det svar jeg manglede.

troede selv det ville være nemt (ala std::map) med en find("serverip"); eller sådan noget men det var det bare ikke :)
Avatar billede bertelbrander Novice
01. oktober 2004 - 00:46 #1
#include <list>
#include <fstream>
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

struct server_info
{
  string name;
  string ip;
};

struct server_parser: public list<server_info>
{
  server_parser(HWND hdwnd, string file_name);
};

server_parser::server_parser(HWND hdwnd, string file_name)
{
  ifstream file(file_name.c_str());
  char temp[1024];

  if(!file.is_open())
      return;
  while(file.good())
  {
      // If # at the beggining of a line, ignore the line
      while(file.peek()== '#')
        while(file.get() != '\n');
      if(file.good())
      {
        server_info info;
        file.getline(temp,1023,'=');
        info.name=temp;
        file.getline(temp,1023);
        info.ip=temp;
        push_back(info);
      }
  }
}

int main()
{
  server_parser Parser(0, "test.dat");
  list<server_info>::iterator it;

  for(it = Parser.begin(); it != Parser.end(); it++)
      cout << it->name << ", " << it->ip << std::endl;
}
Avatar billede bertelbrander Novice
01. oktober 2004 - 00:58 #2
Du kan også bruge find(), først en == operator:

bool operator == (const server_info & lhs, const server_info & rhs)
{
  return lhs.name == rhs.name;
}


Så kan du lede i din liste:
server_info ToFind;
ToFind.name = "serverip";

it = find(Parser.begin(), Parser.end(), ToFind);
if(it != Parser.end())
  cout << "Found: " << it->name << ", " << it->ip << std::endl;
Avatar billede bertelbrander Novice
01. oktober 2004 - 01:02 #3
Bemærk at jeg har:

Rettet håndtering af #'s og  ændret ip i server_info til en std::string, i din kode var det en pointer, det er ikke så godt for den blev sat til at pege på temp, der er meget hurtigt blever overskrevet med noget nyt.
Avatar billede bjering Nybegynder
01. oktober 2004 - 01:41 #4
hvor skal

bool operator == (const server_info & lhs, const server_info & rhs)
{
    return lhs.name == rhs.name;
}

være, kan sq ikke lige få det hele til at passe sammen...

eksempel:

i min server.cpp

int winsockmain()
{
    server_parser Parser(0, "network.ini");
    list<server_info>::iterator it;

    server_info ToFind;
    ToFind.name("UpdateserverIP");

    string serverip;

    it = find(Parser.begin(), Parser.end(), ToFind);
    if(it != Parser.end())
    serverip = it->ip;

    char * sip = strdup(serverip.c_str());
    Log2File(TRUE, "IP 1 : %s\n", sip); // temp til at se om det virkede.
}

hvor skal bool operator hen af ?
lige før winsockmain ?
i min parser.h fil ?

eller ? (får fejl uanset hvor jeg smider den hen)
Avatar billede arne_v Ekspert
01. oktober 2004 - 07:15 #5
bool operator == (const server_info & lhs, const server_info & rhs)
{
    return lhs.name == rhs.name;
}

skal ind i server_parser klassen !
Avatar billede bjering Nybegynder
01. oktober 2004 - 14:18 #6
det kan jeg ikke få til at virke, får error's uanset hvor jeg smider den..
Avatar billede arne_v Ekspert
01. oktober 2004 - 16:05 #7
Må vi se server_parser klassen ?
Avatar billede bertelbrander Novice
01. oktober 2004 - 20:41 #8
Følgende virker med GCC, BorlandC, Visual C++ og Digital Mars:

#include <list>
#include <fstream>
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

struct server_info
{
  string name;
  string ip;
};

struct server_parser: public list<server_info>
{
  server_parser(HWND hdwnd, string file_name);
};

server_parser::server_parser(HWND hdwnd, string file_name)
{
  ifstream file(file_name.c_str());
  char temp[1024];

  if(!file.is_open())
      return;
  while(file.good())
  {
      // If # at the beggining of a line, ignore the line
      while(file.peek()== '#')
        while(file.get() != '\n');
      if(file.good())
      {
        server_info info;
        file.getline(temp,1023,'=');
        info.name=temp;
        file.getline(temp,1023);
        info.ip=temp;
        push_back(info);
      }
  }
}

class CompareClass
{
public:
  bool operator () (const server_info & lhs, const server_info & rhs)
  {
      return lhs.name < rhs.name;
  }
};

bool operator == (const server_info & lhs, const server_info & rhs)
{
  return lhs.name == rhs.name;
}

bool operator != (const server_info & lhs, const server_info & rhs)
{
  return lhs.name != rhs.name;
}

int main()
{
  server_parser Parser(0, "test.dat");
  list<server_info>::iterator it;

  for(it = Parser.begin(); it != Parser.end(); it++)
      cout << it->name << ", " << it->ip << std::endl;

  server_info ToFind;
  ToFind.name = "serverip";

  it = find(Parser.begin(), Parser.end(), ToFind);
  if(it != Parser.end())
      cout << "Found: " << it->name << ", " << it->ip << std::endl;
}
Avatar billede bertelbrander Novice
01. oktober 2004 - 20:55 #9
CompareClass er overflødig.
Avatar billede bjering Nybegynder
02. oktober 2004 - 23:11 #10
ser ud som om det virker, det var nok bare mig der kløjs i det..

smider du et svar bertelbrander ?
Avatar billede bertelbrander Novice
03. oktober 2004 - 00:00 #11
GCC vil have en == operator til find(...) BorlandC en != operator.

Jeg vil stadig ikke have point.
Avatar billede bjering Nybegynder
03. oktober 2004 - 01:18 #12
ah ja, glemte jeg næsten heh..

k, men super mange tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester