Search code examples
c++arraysexc-bad-accessifstream

bad access code with array of ifstream using .open() member function C++


I have this fairly simple assignment where i have two text files with 50 names, i query the user for text file "girls names" or "boys name" and a name, then the program checks to see whether the name that the user input is in the file they selected. i think i've pretty much got it, but i get a bad access code when trying to open the second file. I've read about issues with memory allocation, which i assume is the problem with my code, but the answers were beyond my level of comprehension, so i'm stuck.

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

using namespace std;

int main() {

    // Declare Variables

    ifstream inFile[1]; // male and female file streams
    int inFileArrayVar = 0; // allows switching from female and male file streams
    string gender;
    string name[50];
    string inputName;
    int popular = 0;
    bool inputCondition = 1;
    bool progLoop = 1;

    // Welcome Message
    cout << "*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o" << '\n'
    << "    WELCOME TO THE GENDER BINARY MACHINE" << '\n'
    << "*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o" << '\n' << '\n'

    <<  "Enter a name and see if it is one of the most popular Canadian female or male names in 2015. " << '\n' << '\n';

    // Open Files

    inFile[0].open("GirlsNamesCanada2015.txt");
    inFile[1].open("BoysNamesCanada2015.txt");

    // User Query

    while (inputCondition == 1){

    cout << "Choose to query either the male or female database by entering 'f' or 'm' " << '\n';
    cin >> gender;

        if (gender == "f") {
            cout << "You have selected the female name database. Enter the name you'd like to search: " << '\n';
            inFileArrayVar = 0;
            inputCondition = 0;
        }
        else if (gender == "m"){
            cout << "You have selected the male name database. Enter the name you'd like to search: " << '\n';
            inFileArrayVar = 1;
            inputCondition = 0;
        }
        else
            inputCondition = 1;
    }

    while (progLoop == 1){

        cin >> inputName;

    for (int i = 0; i < 50; i++) {
        inFile[inFileArrayVar] >> name[i];
        if (inputName.compare(name[i]) == 0) {
            popular = 1;
            cout << inputName << " was one of the most popular names in 2015." << '\n' << '\n';
            i = 50;
        }
    }
            if (popular == 0){
                cout << inputName << " was not one of the most popular names is 2015." << '\n' << '\n';
            }

    cout << "If you want to contine, enter either 'f' or 'm', otherwise enter any other character. " << '\n';
        cin >> gender;


        if (gender == "f"){
            cout << "You have selected the female name database. Enter the name you'd like to search: " << '\n';
            inFileArrayVar = 0;
        }
        else if (gender == "m"){
            inFileArrayVar = 1;
            cout << "You have selected the male name database. Enter the name you'd like to search: " << '\n';
        }
        else
            progLoop = 0;


    }

    cout << "merci d'avoir choisi le GENDER BINARY MACHINE ******* pce out ******** " << '\n' << '\n';


    return 0;
}

Solution

  • ifstream inFile[1]; // male and female file streams
    

    Here, you declared an array with one element. This array has one element. That's what [1] means, here.

    inFile[0].open("GirlsNamesCanada2015.txt");
    inFile[1].open("BoysNamesCanada2015.txt");
    

    And then you try to access element #0, and element #1 in the array, the first and the second element in this one element array. What could possibly go wrong?

    When you declare an array:

    type array[n];
    

    This means that the array contains elements #0 through elements #n-1.