Getting "error: expected primary-expression before ']' token" c++

Viewed 144

Working on a school assignment, and I'm on the home stretch (or at least I hope). In my code I'm getting this error on a few lines:

error: expected primary-expression before ']' token|

I'm using CodeBlocks to write in C++. Here's the code

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
using namespace std;

//declare constant variables for the filenames

const std::string inputFileName = "subscriptions.txt";
const std::string outputExpiredFileName = "expiredSubscriptions.txt";
const std::string outputNonexpiredFileName = "mailingLabels.txt";


//declare struct
struct SubscriberInfo
{
    int subscriberNumber;
    string lastName;
    string firstName;
    string streetNumber;
    string city;
    string state;
    string zipCode;
    int expiryDate;

};


//function prototypes
int readFromFile(ifstream &inStream, SubscriberInfo subList[]);

int choiceSelector();
void searchForSubscription(int subNumber, SubscriberInfo subscriberList[], int nSubs);
void writeToExpiredFile(ofstream &outFile, SubscriberInfo subscriberList[], int nSubs, int currentDate);
void writeToMailingLabels(ofstream &outFile, SubscriberInfo subscriberList[], int nSubs, int currentDate);
bool checkExpiry(int today, int expiry);

int main()
{
    //declare stream variables
    ifstream inFile;
    inFile.open(inputFileName);


    //need to make a checker function for these two outFile bits
    ofstream outFile;
    outFile.open(outputExpiredFileName);
    outFile.open(outputNonexpiredFileName);


    //error checker to make sure the file is opened correctly
    if (inFile.fail())
    {
        cout << "ERROR: Can't open file";
        exit(1);
    }

    //read from file and store each line in a separate variable of struct SubscriberList
    SubscriberInfo subscriberList[8];
    int numSubs = readFromFile(inFile, subscriberList);

    int choice;
    choice = choiceSelector();
    do {
        if (choice == 1){
            searchForSubscription(subscriberList, nSubs);
        } else if (choice == 2){
            writeToExpiredFile(outFile, subscriberList, nSubs, currentDate)
            writeToMailingLabels(outFile, subscriberList, nSubs, currentDate)
        }
    }
    while (choice != 3);
    inFile.close();
    outFile.close();
}


//function definitions
int choiceSelector()
{
    int selection;
    //get user input to search for subscription or to generate report
    cout << "------------OPTIONS-------------" << endl;
    cout << "1. Search for subscription" << endl;
    cout << "2. Generate reports" << endl;
    cout << "3. Exit program" << endl;
    cout << "Enter your selection: ";
    cin >> selection;
    return selection;
}


int readFromFile(ifstream &inStream, SubscriberInfo subList[])
{
    string tempSubNumber;
    string tempExpiryDate;
    string blankLine;
    int i=0;

    while (getline(inStream, tempSubNumber))
    {
        subList[i].subscriberNumber = stoi(tempSubNumber);
        getline(inStream, subList[i].lastName);
        getline(inStream, subList[i].firstName);
        getline(inStream, subList[i].streetNumber);
        getline(inStream, subList[i].city);
        getline(inStream, subList[i].state);
        getline(inStream, subList[i].zipCode);
        subList[i].expiryDate = stoi(tempExpiryDate);
        getline(inStream, blankLine);
        i++;
    }
    return i;
}

void searchForSubscription(SubscriberInfo subscriberList[], int nSubs)
{
    int j=0;
    int subNumber;
    bool isFound = false;
    cout << "Enter your subscription number: ";
    cin >> subNumber;
    while (j<nSubs){
        if (subNumber == subscriberList[j].subscriberNumber){
            isFound = true;
            cout << "Name: " << subscriberList[j].firstName << " " << subscriberList[j].lastName << endl;
            cout << "Address: " << subscriberList[j].streetNumber << ", " << subscriberList[j].city << ", " << subscriberList[j].state << " " << subscriberList[j].zipCode << endl;
            cout << "Subscription Number: " << subscriberList[j].subscriberNumber << endl;
            cout << "Expired on: " << subscriberList[j].expiryDate << endl;
            cout << endl;
            j = nSubs;
        }
        j++;
    }
    if (isFound == false){
        cout << "This subscription does not exist." << endl;
    }
}

bool checkExpiry(int today, int expiry)
{
    if (today > expiry)
        return true;
    else
        return false;
}

void writeToExpiredFile(ofstream &outFile, SubscriberInfo subscriberList[], int nSubs, int currentDate)
{
    bool isExpired;
    for (int j=0; j<nSubs; j++)
    {
        isExpired = checkExpiry(currentDate, subscriberList[j].expiryDate);
        if (isExpired == true){
            outFile << subscriberList[j].subscriberNumber << endl;
            outFile << subscriberList[j].lastName << endl;
            outFile << subscriberList[j].firstName << endl;
            outFile << subscriberList[j].streetNumber << endl;
            outFile << subscriberList[j].city << endl;
            outFile << subscriberList[j].state << endl;
            outFile << subscriberList[j].zipCode << endl;
            outFile << subscriberList[j].expiryDate << endl;
            outFile << endl;
        }
    }
}

void writeToMailingLabels(ofstream &outFile, SubscriberInfo subscriberList[], int nSubs, int currentDate)
{
    bool isExpired;
    for (int j=0; j<nSubs; j++)
    {
        isExpired = checkExpiry(currentDate, subscriberList[j].expiryDate);
        if (isExpired == false){
            outFile << "Name: " << subscriberList[j].firstName << " " << subscriberList[j].lastName << endl;
            outFile << "Address: " << subscriberList[j].streetNumber << ", " << subscriberList[j].city << ", " << subscriberList[j].state << " " << subscriberList[j].zipCode << endl;
            outFile << "Subscription Number: " << subscriberList[j].subscriberNumber << endl;
            outFile << "Expired on: " << subscriberList[j].expiryDate << endl;
            outFile << endl;
        }
    }
}

When I try to build, I get that error and others like it on lines 81 and 83. I imagine it's either an issue with those function calls, or a simple syntax error I'm not seeing.

EDIT: I removed the comment block at the top since this text input doesn't seem to pick it up.

EDIT2: On @Savaria's suggestion, I removed the square brackets from the function call. I'm still getting this error on (what is now) line 67:

error: 'nSubs' was not declared in this scope
I'm still not quite sure what to put in here. If I just remove it, it doesn't receive enough arguments and hits me with the error for that.
Also, I am receiving a very similar error on line 69, but it's basically the same. Once I figure out how to solve the line 67 issue, I can use the same knowledge for line 69.

2 Answers

Ok, so I've gotten rid of those errors and everything. I'm now having an issue trying to get this while loop to work correctly. Here's the code as it is now

#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
using namespace std;

//declare constant variables for the filenames

const std::string inputFileName = "subscriptions.txt";
const std::string outputExpiredFileName = "expiredSubscriptions.txt";
const std::string outputNonexpiredFileName = "mailingLabels.txt";


//declare struct
struct SubscriberInfo
{
    int subscriberNumber;
    string lastName;
    string firstName;
    string streetNumber;
    string city;
    string state;
    string zipCode;
    int expiryDate;

};


//function prototypes
int readFromFile(ifstream &inStream, SubscriberInfo subList[]);
int choiceSelector();
void searchForSubscription(SubscriberInfo subscriberList[], int nSubs);
bool checkExpiry(int today, int expiry);
void writeToExpiredFile(ofstream &outFileToExpired, SubscriberInfo subscriberList[], int nSubs, int currentDate);
void writeToMailingLabels(ofstream &outFileToMailingLabels, SubscriberInfo subscriberList[], int nSubs, int currentDate);


int main()
{
    //declare stream variables
    ifstream inFile;
    inFile.open(inputFileName);

    ofstream outFileToExpired;
    ofstream outFileToMailingLabels;
    outFileToExpired.open(outputExpiredFileName);
    outFileToMailingLabels.open(outputNonexpiredFileName);


    //error checker to make sure the file is opened correctly
    if (inFile.fail())
    {
        cout << "ERROR: Can't open file";
        exit(1);
    }

    //read from file and store each line in a separate variable of struct SubscriberList
    SubscriberInfo subscriberList[8];

    cout << "------------OPTIONS-------------" << endl;
    cout << "1. Search for subscription" << endl;
    cout << "2. Generate reports" << endl;
    cout << "3. Exit program" << endl;

    //get numSubs from returned i form readFromFile();
    int numSubs = readFromFile(inFile, subscriberList);
    int choice;
    choice = choiceSelector();
    int currentDate;
    //display main menu

    do {
        if (choice == 1){
            searchForSubscription(subscriberList, numSubs);
            cout << "test to show selection 1" << endl;
            //choice = 0;
            choice = choiceSelector();
        } else if (choice == 2){
            cout << "Please enter the current date in YYMM format: ";
            cin >> currentDate;
            writeToExpiredFile(outFileToExpired, subscriberList, numSubs, currentDate);
            writeToMailingLabels(outFileToMailingLabels, subscriberList, numSubs, currentDate);
            cout << "test to show selection 2" << endl;
            //choice = 0;
            choice = choiceSelector();

        } else if (choice == 3){
            return 0;
        }
        choice = choiceSelector();
    } while (choice == 0);

    inFile.close();
    outFileToExpired.close();
    outFileToMailingLabels.close();
}


//function definitions
int readFromFile(ifstream &inStream, SubscriberInfo subList[])
{
    string tempSubNumber;
    string tempExpiryDate;
    string blankLine;
    int i=0;

    while (getline(inStream, tempSubNumber))
    {
        subList[i].subscriberNumber = stoi(tempSubNumber);
        getline(inStream, subList[i].lastName);
        getline(inStream, subList[i].firstName);
        getline(inStream, subList[i].streetNumber);
        getline(inStream, subList[i].city);
        getline(inStream, subList[i].state);
        getline(inStream, subList[i].zipCode);
        getline(inStream, tempExpiryDate);
        subList[i].expiryDate = stoi(tempExpiryDate);
        getline(inStream, blankLine);
        i++;
    }
    return i;
}

int choiceSelector()
{
    int selection;
    //get user input to search for subscription or to generate report

    cout << "Enter your selection: ";
    cin >> selection;
    return selection;
}

void searchForSubscription(SubscriberInfo subscriberList[], int nSubs)
{
    int j=0;
    int subNumber;
    bool isFound = false;
    cout << "Enter your subscription number: ";
    cin >> subNumber;
    while (j<nSubs){
        if (subNumber == subscriberList[j].subscriberNumber){
            isFound = true;
            cout << "Name: " << subscriberList[j].firstName << " " << subscriberList[j].lastName << endl;
            cout << "Address: " << subscriberList[j].streetNumber << ", " << subscriberList[j].city << ", " << subscriberList[j].state << " " << subscriberList[j].zipCode << endl;
            cout << "Subscription Number: " << subscriberList[j].subscriberNumber << endl;
            cout << "Expired on: " << subscriberList[j].expiryDate << endl;
            cout << endl;
            j = nSubs;
        }
        j++;
    }
    if (isFound == false){
        cout << "This subscription does not exist." << endl;
    }
}

bool checkExpiry(int today, int expiry)
{
    if (today > expiry)
        return true;
    else
        return false;
}

void writeToExpiredFile(ofstream &outFileToExpired, SubscriberInfo subscriberList[], int nSubs, int currentDate)
{
    bool isExpired;
    for (int j=0; j<nSubs; j++)
    {
        isExpired = checkExpiry(currentDate, subscriberList[j].expiryDate);
        if (isExpired == true){
            outFileToExpired << subscriberList[j].subscriberNumber << endl;
            outFileToExpired << subscriberList[j].lastName << endl;
            outFileToExpired << subscriberList[j].firstName << endl;
            outFileToExpired << subscriberList[j].streetNumber << endl;
            outFileToExpired << subscriberList[j].city << endl;
            outFileToExpired << subscriberList[j].state << endl;
            outFileToExpired << subscriberList[j].zipCode << endl;
            outFileToExpired << subscriberList[j].expiryDate << endl;
            outFileToExpired << endl;
        }
    }
}

void writeToMailingLabels(ofstream &outFileToMailingLabels, SubscriberInfo subscriberList[], int nSubs, int currentDate)
{
    bool isExpired;
    for (int j=0; j<nSubs; j++)
    {
        isExpired = checkExpiry(currentDate, subscriberList[j].expiryDate);
        if (isExpired == false){
            outFileToMailingLabels << "Name: " << subscriberList[j].firstName << " " << subscriberList[j].lastName << endl;
            outFileToMailingLabels << "Address: " << subscriberList[j].streetNumber << ", " << subscriberList[j].city << ", " << subscriberList[j].state << " " << subscriberList[j].zipCode << endl;
            outFileToMailingLabels << "Subscription Number: " << subscriberList[j].subscriberNumber << endl;
            outFileToMailingLabels << "Expired on: " << subscriberList[j].expiryDate << endl;
            outFileToMailingLabels << endl;
        }
    }
}

I'm mostly confused on this part here:

    choice = choiceSelector();
    int currentDate;
    //display main menu

    do {
        if (choice == 1){
            searchForSubscription(subscriberList, numSubs);
            cout << "test to show selection 1" << endl;
            //choice = 0;
            choice = choiceSelector();
        } else if (choice == 2){
            cout << "Please enter the current date in YYMM format: ";
            cin >> currentDate;
            writeToExpiredFile(outFileToExpired, subscriberList, numSubs, currentDate);
            writeToMailingLabels(outFileToMailingLabels, subscriberList, numSubs, currentDate);
            cout << "test to show selection 2" << endl;
            //choice = 0;
            choice = choiceSelector();

        } else if (choice == 3){
            return 0;
        }
        choice = choiceSelector();
    } while (choice == 0);

DONE! I finally got it figured out. My condition for the do while loop was wrong. I changed it to

    do {
        if (choice == 1){
            searchForSubscription(subscriberList, numSubs);
            choice = 0;
        } else if (choice == 2){
            cout << "Please enter the current date in YYMM format: ";
            cin >> currentDate;
            writeToExpiredFile(outFileToExpired, subscriberList, numSubs, currentDate);
            writeToMailingLabels(outFileToMailingLabels, subscriberList, numSubs, currentDate);
            choice = 0;
        }
        choice = choiceSelector();
    } while (choice != 3);```
Related