Oh, "mac."
I had a similar problem when I started porting my stuff. At least on the Mac I used, the current working directory was always the user's home directory, regardless of where the actual executable file was. As far as I know the only solutions are: 1) make a proper app/dmg for your game so it gets installed in the usual place and you can rely on that, or 2) ask Mac OS for the executable filepath on startup.
I wasn't ready to learn how every other OSs installers worked (they're massively overcomplicated on all three so I'm not exactly eager to work it out), so I went with #2. To save you a bit of time, here's the badly written block of code I have lying around for this purpose:
//on Mac OS X the working directory defaults to your home folder
//instead of the path of the executable, so we need to fix that
#if defined __APPLE__ && defined __MACH__
//__APPLE__ is defined on all Apple computers, __MACH__ on Mach-based kernels; together they specify OS X
#include <unistd.h>
#include <mach-o/dyld.h>
#include <errno.h>
uint32_t i = 1024;
char* s; s = new char[i];
_NSGetExecutablePath(s, &i);
std::string str = std::string(s);
str = str.substr(0, str.find_last_of("/"));
if(!chdir(str.c_str()))
throw(std::wstring("Failed to change working directory to executable path: " + strerror(errno)));
delete[] s;
#endif
Sadly, I'm pretty sure there is no cross-platform way of loading resource files from relative paths (I spent a very long time looking for such a thing). Even the Filesystem proposal for C++ doesn't include any function that would help with this, so every program with even a single resource file will always have to call some utility function with #ifdefs to handle those files.