zeboidlund
zeboidlund

Reputation: 10137

Reading a text file using a relative path

I'm looking to read a text file using a relative path in C++. The directory structure is as follows: source -> Resources -> Settings -> Video.txt.

The contents of the file (note: these are used for testing, of course):

somes*** = 1
mores*** = 2
evenmores*** = 3

According to my research, this is possible. Still, I find that this has yet to work. For example, when I step through my debugger, my char *line variable which is used to receive line-by-line text file input is always at a constant 8 value. As to my understanding, a char pointer can act as a dynamic array of characters which you may reassign to.

Why can't I read my file? When I try do an if ( !videoSettings ), it returns true, and I get an error message (created by myself).

Code

#ifdef WIN32
    const char *filePath = "Resources\\Settings\\Video.txt";
#else
    const char *filePath = "Resources/Settings/Video.txt";
#endif

    std::ifstream videoSettings( filePath );

    if ( !videoSettings )
    {
        cout << "ERROR: Failed opening file " << filePath << ". Switching to configure mode." << endl;

        //return false;
    }

    int count = 0;

    char *line;

    while( !videoSettings.eof() )
    {
        videoSettings >> line;

        cout << "LOADING: " << *line << "; ";

        count = sizeof( line ) / sizeof( char );

        cout << "VALUE: " << line[ count - 1 ];

        /*

        for ( int i = count; i > count; --i )
        {
            if ( i == count - 4 )
            {

            }
        }

        */
    }

    delete line;

Upvotes: 0

Views: 4860

Answers (1)

Adrian Cornish
Adrian Cornish

Reputation: 23866

Wow ok- you cannot read a string of text into just a char * you need to preallocate the memory first.

2nd the size of a char* pointer is constant - but the size of the data it points to is not

I suggest using the std::string getline call and avoid all the dynamic memory allocation

So this would be

std::ifstream in("file.txt");
std::string line;
while(getline(in, line))
{
    std::cout << line << std::endl;
}

Lastly relative paths are the last of your problems in you code example :-)

Upvotes: 2

Related Questions