How to properly apply this nested ifstream? - c++11

I want to use an ifstream function that calls another ifstream function inside it, but I have no idea why it does not work. The ifstream called first works fine, but the second one does not. This is the first one:
ifstream archivo("civilizaciones.txt");
if(archivo.is_open()){
while(!archivo.eof()){
string name;
Civilizacion a;
getline(archivo, name);
if(archivo.eof()){ break; }
a.setName(name);
arreglo.push_back(a);
c.recuperarAld(name);
}
}
c.recuperarAld(name) Calls the following function in a class with object c:
void Civilizacion::recuperarAld(string name)
{
ifstream aldeanoss(name + ".txt");
if(aldeanoss.is_open()){
while(!aldeanoss.eof()){
Aldeano a;
string linea;
getline(aldeanoss,linea);
if(aldeanoss.eof()){break;}
a.setNombre(linea);
getline(aldeanoss, linea);
a.setEdad(stoul(linea));
getline(aldeanoss, linea);
a.setGenero(linea);
getline(aldeanoss, linea);
a.setSalud(stoi(linea));
aldeanos.push_back(a);
}
}
}
But this second one does not seem to work, how can I fix it?

Related

Calling parent struct inherited methods

I have a struct A that inherits from other classes (which I'm not allowed to change). Inside A and it's methods I can call inherited methods (lets say A_method(int i), for example) without problem but when I tried to write a nested struct (lets say In) and call A_method(int i) and there is were I'm stuck.
The initial code looks like this, and I can't change it, is some kind of college assigment.
#include "Player.hh"
struct A : public Player {
static Player* factory () {
return new A;
}
virtual void play () {
}
};
RegisterPlayer(PLAYER_NAME);
Then I tried this:
#include "Player.hh"
struct A : public Player {
static Player* factory () {
return new A;
}
//My code
struct In {
int x;
void do_smthing() {
A_method(x);
}
}
virtual void play () {
}
};
RegisterPlayer(PLAYER_NAME);
Ok, from a beginning I knew I could't do this, for In to see it's parent class it should have a pointer to it but In is a often instantiated object in my code and I wanted to avoid passing this constantly to a constructor so I tried this aproach:
#include "Player.hh"
struct A : public Player {
static Player* factory () {
return new A;
}
//My code
static struct Aux
A* ptr;
Aux(A* _p) { ptr = _p; }
} aux;
struct In {
int x;
void do_smthing() {
aux.ptr->A_method(x);
}
}
virtual void play () {
//the idea is to call do_smthing() here.
}
};
RegisterPlayer(PLAYER_NAME);
What I want to avoid (if possible) is something like this:
struct In {
int x;
A* ptr;
In (A* _p) : ptr(_p) {}
void do_smthing() {
ptr->A_method(x);
}
}
The main reason for this: I have more struct definitions and they they are instantiated multiple times through the rest of the (omitted) code, and I don't like the idea of seeing In(this) so many times.
I don't know if I'm completly missing something or what I want to do it's just not possible... Please ask for clarifications if necessary.
(Also, performance is kind of critical, my code will be tested with limited CPU time so I kinda have to avoid expensive approachs if possible. Using C++11)
There is no way you can skip passing the this pointer. Instead, you could create a helper function in A:
template <typename InnerType, typename ...Params>
InnerType makeInner(Params&&... params)
{
return InnerType(this, std::forward<Params>(params)...);
}
Then you can use
auto * a = A::factory();
auto inner = a->makeInner<A::In>();
I have some suggestions which are not directly related to you question but may help:
A::facotry() returns a std::unique_ptr<A> instead of raw pointer
Try to describe what problem you are trying to solve. I have a strong feeling that there can be a better design other than creating many nested structs.
I don't see passing a this pointer could have any impact on the performance. The more important thing is to identify the path that is latency-sensitive and move expensive operations out of those paths.

assign std::unique_ptr to std::function

There is a custom defined map, with an element std::function()>.
The lambda code is working, but I don't know how to expand it to a normal formation. The code is following.
class TestA{
public:
TestA() {}
~TestA() {}
TestA(const TestA &) {}
static void print()
{
cout << __FUNCTION__ << endl;
return;
}
};
void testComplexMap1()
{
typedef map<string, std::function<std::unique_ptr<TestA>()>> TempMap;
TempMap m;
// the lambda format code, it works
//m.insert({ "TestA", []() {return std::unique_ptr<TestA>(new TestA());}});
// I want to expand it, but failed.
TestA *t = new TestA();
//function<unique_ptr<TestA>()> fp(unique_ptr<TestA>(t));
function<unique_ptr<TestA>()> fp(unique_ptr<TestA>(t)()); //warning here
//m.emplace("TestA", fp); // compile error here
}
Any help will be greatly appreciated.
fp is not initialized with a function so compilation fails.
You can expand it like this:
TestA *t = new TestA();
std::unique_ptr<TestA> UT(t);
auto func = [&]() { return move(UT);};
std::function<std::unique_ptr<TestA>()> fp(func);
m.emplace("TestA", fp);
See DEMO.
In C++ everything that looks like it could be a declaration is treated as such.
This means the line
function<unique_ptr<TestA>()> fp(unique_ptr<TestA>(t)());
is interpreted as:
fp is the declaration of a function returning an std::function<unique_ptr<TestA>()> and expecting a parameter called t which is a function pointer to a function returning a std::unique_ptr<TestA> and getting no parameter. (Which is not what you intended.)
This also means that the t in this line is not the same t as in the previous line.
You have to pass fp something that is actually callable like this:
std::unique_ptr<TestA> f() {
return std::make_unique<TestA>();
}
void testComplexMap1() {
// ...
function<unique_ptr<TestA>()> fp(f);
m.emplace("TestA1", fp);
}
If you want to add a function to the map that wraps an existing pointer into a unique_ptr you would need either a functor:
class Functor {
public:
Functor(TestA * a) : m_a(a) {}
~Functor() { delete m_a; }
std::unique_ptr<TestA> operator()(){
auto x = std::unique_ptr<TestA>(m_a);
m_a = nullptr;
return std::move(x);
}
private:
TestA * m_a;
};
void testComplexMap1() {
//...
TestA * t = new TestA();
m.emplace("TestA", Functor(t));
}
Or a lambda with capture:
void testComplexMap1() {
//...
TestA * t = new TestA();
m.emplace("TestA", [t](){ return std::unique_ptr<TestA>(t); });
}
The lamda is translated more or less to something like the Functor class. However in each case you have to be really careful: The functions in the map that encapsulate an existing pointer into a std::unique_ptr can and should only be called once.
If you don't call them, memory allocated for t won't be freed. If you call them more than once you get either a std::unique_ptr to nullptr (in my Functor class variant) or a more than one std::unique_ptr tries to manage the same memory region (in the lambda with capture variant), which will crash as soon as the second std::unique_ptr is deleted.
In short: I would advice against writing code like this and only put functions in the map that are callable multiple times.

No able to reinitialize the WCHAR[] array once it gets the initialized

While(1)
{
WCHAR wcImageName[80];
if ( pxmlNameTag->GetData(wcImageName, wcslen(wcImageName)) )
{
if ( !wcscmp(wcImageName, String2) )
{
Printf("String matched");
break;
}
else
{
Printf("In else");
}
}
else
{
Printf("Failed to get the data");
}
}
}
I am iterating the loop till i got the matching string. GetData is used to get the string into wcImageName. 1st time a am able to get the data into wcImageName and it is compared with string2. If not matched loop iterate 2nd time. i am declaring wcImageName again but GetData is not able to copy the data into wcImageName. because it is initialized. i have tried to initialize it with L'\0' but the same result.

How to read an online file from a Thread using wxWidgets

I have a problem trying to read an online file from a thread. The same code works correctly if is not inside a thread. But if it is inside of the thread, the application dies.
The thread also works correctly if I do not try to read the file.
The following code works correctly:
wxInputStream *httpStream; ///it is a global variable.
void contadorFrame::ConnetAndRead()
{
wxHTTP get;
get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8"));
get.SetTimeout(10);
wxString sever, path;
getURLParts(TextCtrl_url->GetValue(), sever, path);
while (!get.Connect(sever ,80 ))
wxSleep(5);
httpStream = get.GetInputStream( path );
if (get.GetError() == wxPROTO_NOERR)
{
wxString xml_buff;
wxStringOutputStream out_stream(&xml_buff);
httpStream->Read(out_stream);
std::string standarize( estandarizaXML( xml_buff.ToStdString() ) );
readXML(standarize.c_str());///read file from buffer
}
else
{
wxMessageBox(_T("Unable to connect!"));
}
wxDELETE(httpStream);
get.Close();
}
I know I should avoid using GUI functions inside threads, and so I'm trying this way.
void contadorFrame::ConnetAndRead()
{
wxHTTP get;
get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8"));
get.SetTimeout(10);
wxString sever, path;
getURLParts(TextCtrl_url->GetValue(), sever, path);
while (!get.Connect(sever ,80 ))
wxSleep(5);
httpStream = get.GetInputStream( path );
if (get.GetError() == wxPROTO_NOERR)
{
PerformCalculation(); // create and run the thread
}
else
{
wxMessageBox(_T("Unable to connect!"));
}
wxDELETE(httpStream);
get.Close();
}
void contadorFrame::PerformCalculation()// create and run the thread
{
m_pThread = new MyThread(this, httpStream);
m_pThread->Create();
if ( m_pThread->Run() != wxTHREAD_NO_ERROR )
{
wxLogError("Can't create the thread!");
delete m_pThread;
m_pThread = NULL;
}
}
The following code works incorrectly
void *MyThread::Entry()
{
wxCommandEvent evt(wxEVT_MYTHREAD, GetId());
wxString xml_buff;
wxStringOutputStream out_stream(&xml_buff);
httpStream->Read(out_stream); //this fails
std::string standarize( estandarizaXML( xml_buff.ToStdString() ) );
readXML(standarize.c_str());///read file from buffer
wxPostEvent(m_pHandler, evt);
return (wxThread::ExitCode)0; // success
}
Anyone can help to solve this problem? Another way to do the same?
Thank you very much!!
I have a solution. But it does not work totally fine !!
http://docs.wxwidgets.org/trunk/classwx_socket_base.html
When using wxSocket from multiple threads, even implicitly (e.g. by using wxFTP or wxHTTP in another thread) you must initialize the sockets from the main thread by calling Initialize() before creating the other ones.
void contadorFrame::ConnetAndRead()
{
wxHTTP get;
get.Initialize();
get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8"));
get.SetTimeout(10);
wxString sever, path;
getURLParts(TextCtrl_url->GetValue(), sever, path);
while (!get.Connect(sever ,80 ))
wxSleep(5);
httpStream = get.GetInputStream( path );
if (get.GetError() == wxPROTO_NOERR)
{
PerformCalculation(); // create and run the thread
}
else
{
wxMessageBox(_T("Unable to connect!"));
}
wxDELETE(httpStream);
get.Close();
}
this fails, but if i do (wxHTTP get) a global variable, like this, then it works
wxHTTP get;
void contadorFrame::ConnetAndRead()
{
get.Initialize();
get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8"));
get.SetTimeout(10);
wxString sever, path;
getURLParts(TextCtrl_url->GetValue(), sever, path);
while (!get.Connect(sever ,80 ))
wxSleep(5);
httpStream = get.GetInputStream( path );
if (get.GetError() == wxPROTO_NOERR)
{
PerformCalculation(); // create and run the thread
}
else
{
wxMessageBox(_T("Unable to connect!"));
}
wxDELETE(httpStream);
get.Close();
}
The problem now is that the debugger tells me a warning message like this.
../../scr/common/socket.cpp(297): assert ""app"" failed to Init(): sockets can't be initialized without wxApp
Do you want to stop the program?
if I choose NO, the program runs perfect!!
What is the correct way to initialize the socket? That is, where should I put this (wxHTTP::Initialize()) to not receive warning messages from the debugger?
SOLVE :-)
I did this
bool contadorApp::OnInit()
{
wxSocketBase::Initialize();
//(*AppInitialize
bool wxsOK = true;
wxInitAllImageHandlers();
if ( wxsOK )
{
contadorFrame* Frame = new contadorFrame(0);
Frame->Show();
SetTopWindow(Frame);
}
//*)
return wxsOK;
}
and this
class contadorFrame: public wxFrame
{
public:
wxHTTP get;
};
Now Works perfect!!
thx u guys!!

Class method callbacks in D to C functions

I'm writing a simple, lightweight engine in D. For the input calls I use GLFW3. The library in question uses callbacks to send input events to the program.
What I would like is to use a method from a class as the callback function, rather than a function. This is proving difficult (just as it is in C++). I believe there is an elegant way to do it, but this is how I got it right now.
public void initialise(string logPath) {
[...]
m_Window = new RenderWindow();
m_Window.create();
// Lets set up the input loop.
GLFWkeyfun keyCB = function(GLFWwindow* win, int key, int scancode, int action, int mods) {
printf("Got key event: %d:%d:%d:%d\n");
RenderWindow rw = Root().getRenderWindow();
switch (key) {
case KeyboardKeyID.Q:
glfwSetWindowShouldClose(win, true);
break;
case KeyboardKeyID.H:
if (rw.hidden) {
rw.show();
} else {
rw.hide();
}
break;
default:
break;
}
};
glfwSetKeyCallback(m_Window.window, keyCB);
}
Here is the definition of the callback setting function and type:
extern (C) {
alias GLFWkeyfun = void function(GLFWwindow*, int, int, int, int);
GLFWkeyfun glfwSetKeyCallback(GLFWwindow*, GLFWkeyfun);
}
What I would like to do instead, is create a method that is part of the class. Is there any way to do this?
A solution I tried was a static method wrapped around in extern (C), this worked for calling it, but then I could (obviously) not access this or any other methods, which defeats the point of the exercise.
Thanks in advance.
The way I'd do it is to have a static map of the pointers to the class, so like:
static YourWindowClass[GLFWwindow*] mappings;
Then, in the constructor, once you get a GLFWwindow pointer, add it right in:
mappings[m_Window.window] = this;
Now, make the static extern(C) function to use as the callback. When it gets a pointer from C, look up your class reference in that mappings array and then go ahead and call the member function through that, forwarding the arguments.
So a bit of an extra step, but since it doesn't look like the callback lets you pass user-defined data to it (BTW, attention all lib writers: user-defined void* to the callbacks is sooooo useful, you should do it whenever possible!), but since it doesn't do that the associative array is the next best thing.
Well, I have figured it out my own. The solution I went with was a Singleton class InputManager. Instances of RenderWindow attach themselves to it with the following function. The InputManager then creates an anonymous function() for the RenderWindow that receives events, which then calls a function that handles the actual event.
The idea is then that listeners attach themselves to the InputManager and receive keyboard events for the RenderWindow they requested.
class InputManager {
private static InputManager m_Instance;
private RenderWindow[] m_Watched;
private KeyboardListener[][RenderWindow] m_KeyListeners;
public void recvKeyEvent(GLFWwindow* w, int k, int c, int a, int m) {
writeln("Received key: ", k);
}
public void watch(RenderWindow win) {
if (!isWatched(win)) {
// Relay the key callbacks onto the InputManager.
GLFWkeyfun keyCB = function(GLFWwindow* w, int k, int c, int a, int m) {
InputManager().recvKeyEvent(w, k, c, a, m);
};
glfwSetKeyCallback(win.window, keyCB);
}
}
private bool isWatched(RenderWindow win) {
foreach(RenderWindow w; m_Watched) {
if (win == w) {
return true;
}
}
return false;
}
public static InputManager opCall() {
if (m_Instance is null) {
m_Instance = new InputManager();
}
return m_Instance;
}
private this() {
// nothing
}
}
Works like a charm, now to figure out how to properly attach listeners elegantly.
For those curious, the full source code with how this is set up can be found at https://github.com/Adel92/Mage2D. I hope it helps someone else in a similar position with callbacks.

Resources