0

I'm trying to separate a text file (which has a list of 200 strings) and store each other string (even number and odd number in the list) into a 2D Array.

The text file is ordered in this way (without the numbers):

  1. Alabama
  2. Brighton
  3. Arkansas
  4. Bermuda
  5. Averton
  6. Burmingham

I would like to store it in a 2 dimensional array called strLine[101][2] iterating throughout so the first string in the list is in location [0][0] and the second string of the list is in location [0][1], etc until the file finishes reading and the list becomes organized like this (without the numbers):

  1. Alabama | Brighton
  2. Arkansas | Bermuda
  3. Avertinon | Burmingham

My code outputs the original unsorted list at the moment, i would like to know how to implement the 2d array (with correct syntax) and how to implement an i, j for-loop in the getline() function so it can iterate through each element of the 2D array.

Any help would be greatly appreciated.

My code:

bool LoadListBox()
{

    // Declarations
    ifstream fInput;                                // file handle
    string strLine[201];                            // array of string to hold file data
    int index = 0;                                  // index of StrLine array
    TCHAR szOutput[50];                             // output to listbox, 
    50 char TCHAR

    // File Open Process
    fInput.open("data.txt");                        // opens the file for read only
    if (fInput.is_open())
    {
        getline(                                    // read a line from the file
            fInput,                                 // handle of file to read
            strLine[index]);                    // storage destination and index iterator

        while (fInput.good())                       // while loop for open file
        {
            getline(                                // read line from data file
                fInput,                             // file handle to read
                strLine[index++]);              // storage destination
        }

        fInput.close();                             // close the file
        index = 0;                                  // resets back to start of string

        while (strLine[index] != "")                // while loop for string not void
        {
            size_t pReturnValue;                    // return code for mbstowcs_s

            mbstowcs_s(                             // converts string to TCHAR
                &pReturnValue,                      // return value
                szOutput,                           // destination of the TCHAR
                50,                                 // size of the destination TCHAR
                strLine[index].c_str(),             // source of string as char
                50);                                // max # of chars to copy

            SendMessage(                            // message to a control
                hWnd_ListBox,                       // handle to listbox
                LB_ADDSTRING,                       // append string to listbox
                NULL,                               // window parameter not used
                LPARAM(szOutput));                  // TCHAR to add

            index++;                                // next element of string array
        }
        return true;                                // file loaded okay 
    }
    return false;                                   // file did not load okay
}
eyllanesc
  • 190,383
  • 15
  • 87
  • 142
BuG
  • 1
  • I know the string strLine[201] array will have to change into a string strLine[101][2] array in my declarations. In the while(fInput.good( )) loop the strLine[index++] has to change into a for-loop somehow to go through all the elements in the array. Im not sure how to include the syntax for that –  Jan 28 '19 at 04:33
  • Unrelated: `while (fInput.good())` tests for validity BEFORE performing the read allowing the read to fail undetected. This leads to the program to, among other things, need a 201 array elements to store a 200 item file. See [Why is iostream::eof inside a loop condition considered wrong?](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) for a similar problem – user4581301 Jan 28 '19 at 05:10

1 Answers1

0

Step 1

Transform string strLine[201]; to string place[100][2];. Also consider making a

struct place
{
    std::string state;
    std::string city;
};

because it is a bit more explicit what exactly is being stored. More expressive code is easier to read, generally prevents mistakes (harder to accidentally use strLine[x][2] or something like that), and requires less commenting. Code that comments itself should be a personal goal. The compiler doesn't care, of course, but few people are compilers.

Step 2

Use two separate index variables. Name the first something like num_entries because what it's really doing is counting the number of items in the array.

Step 3

Read two lines into the inner array and test the result of the reads. If they read successfully, increment the index.

while (getline(fInput, place[num_entries][0]) && getline(fInput, place[num_entries][1]))
{
    num_entries++;
}

Step 4 (optional clean-up)

Step 2 turns while (strLine[index] != "") into while (index < num_entries)

Replace all of the 50s with a constant. That way you can't change the value and miss a few 50s AND it's easier to infer meaning from a good, descriptive identifier than a raw number.

user4581301
  • 29,019
  • 5
  • 26
  • 45