Home > Software design >  Loading a 2D array from an input file into a Function
Loading a 2D array from an input file into a Function

Time:09-03

I am having trouble loading a 10x10 array from an input file and storing it into an array. I have written this so far:

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

using namespace std;

void LoadImage(const string imagefile, int image[MAXROWS][MAXCOLS]) //Function to load in image
{
    ifstream inputs;
    int i,j;

    inputs.open(imagefile.c_str());
        
    getline(inputs, imagefile[i][j]);
    inputs.ignore(10000,'\n');
    
    if (inputs.is_open())
    {
        for( i=0; i < MAXROWS; i   )
        {
            for ( j=0; i < MAXCOLS; j   )
            {
                inputs >> image[i][j];
            }
        }
    }
    
    inputs.close();
}

The void LoadImage function and was given to me with those specific parameters to use or the main function will not execute. An example of an input file:

#Sample Image--1

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 1 1 1 1 0 0 0 0
0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 1 1 0 0
0 0 0 0 0 0 1 1 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Where I have to get rid of the header of the input file before building the array. If I compile what I have now I get the "error: invalid types ‘const char[int]’ for array subscript getline(inputs, imagefile[i][j]);"

I understand why I am getting the error, but I do not know how to fix it. I appreciate any help I can get!

CodePudding user response:

The code is generally OK, just following the comments and fixing a few small mistakes should work. Note specially the terminating condition for the following loop:

for ( j=0; i < MAXCOLS; j   )

Should be instead:

for ( j=0; j < MAXCOLS; j   )

This is the reason why you're getting an infinite loop.

Here's the complete code:

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

#define MAXROWS 10
#define MAXCOLS 10

using namespace std;

void LoadImage(const string imagefile, int image[MAXROWS][MAXCOLS]) //Function to load in image

{
    ifstream inputs;
    int i,j;

    inputs.open(imagefile.c_str());

    if (inputs.is_open())
    {
        for( i=0; i < MAXROWS; i  )
        {
            for (  j=0; j < MAXCOLS; j   )
            {
                std::string str;

                inputs >> image[i][j];
            }
        }
    }

    inputs.close();
}

void PrintImage(int image[MAXROWS][MAXCOLS])
{
    int i,j;

    for(i = 0; i < MAXROWS; i  )
    {
        for (j = 0; j < MAXCOLS; j   )
        {
            cout << image[i][j] << " ";
        }
        cout << endl;
    }
}

int main()
{
    int image[MAXROWS][MAXCOLS] = {0,};

    LoadImage ("img.mtx", image);

    PrintImage (image);
}

And testing:

$ cat img.mtx 
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 
0 0 0 0 1 1 0 0 0 0 
0 0 1 1 1 1 0 0 0 0 
0 0 1 1 1 1 0 0 0 0 
0 0 0 0 0 0 1 1 0 0 
0 0 0 0 0 0 1 1 0 0 
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

$ g   main.cpp && ./a.out 
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 1 0 0 0 0 
0 0 0 0 1 1 0 0 0 0 
0 0 1 1 1 1 0 0 0 0 
0 0 1 1 1 1 0 0 0 0 
0 0 0 0 0 0 1 1 0 0 
0 0 0 0 0 0 1 1 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0

CodePudding user response:

The line

getline(inputs, imagefile[i][j]);

does not make sense.

If you want to ignore the first line of the input file, then you should simply use inputs.ignore, as you are already doing afterwards. So you can simply delete the line which calls getline.

Another problem is that the line

for ( j=0; i < MAXCOLS; j   )

should probably be

for ( j=0; j < MAXCOLS; j   )

i.e. you wrote i instead of j.

  • Related