user8585343
user8585343

Reputation: 9

Multiple errors with function header, and overloaded functions

it's my first time working with classes and headers in C++ and I ran into these errors after putting together my code

The program is designed to read and write to a file, while also doing searches and being able to manipulate the binary file. I'm pretty sure the error is in my declarations somewhere but I can't figure it out myself; any help is appreciated.

main.cpp

#include <iostream>
#include<iomanip>
#include <fstream>

#include"animals.h"

using namespace std;
int main()
{
    Animals nA;

    fstream animalFile;
    int choice;
    cout << setprecision(2) << fixed;
    do
    {
        // Display the menu.
        cout << "\n1. Add a new animal\n";
        cout << "2. Remove an animal\n";
        cout << "3. Search and display a animal\n";
        cout << "4. Display all animals\n";
        cout << "5. Exit\n";
        do
        {
            cout << "Enter your choice (1-5): ";
            cin >> choice;
        } while (choice < 1 || choice > 5);
        // Process the selection.
        switch (choice)
        {
            // Choice 1 is to add an animal
        case 1:
            nA.addAnimal(animalFile);
            break;
            // Choice 2 is to remove an animal
        case 2:
            nA.removeAnimal(animalFile);
            break;
            // Choice 3 is to search and display 1 animal
        case 3:
            nA.searchAnimal(animalFile);
            break;
            // Choice 4 is to display all animals
        case 4:
            nA.displayAnimal(animalFile);
        }
    } while (choice != 5);
    system("pause");
    return 0;
}

Animals.h

#ifndef ANIMALS_H
#define ANIMALS_H
#include <string>
#include <iostream>
#include <fstream>

class Animals
{
private :
    std::string name;
    int age;
public : 
    //Default constructor
    Animals();
    //Create an animal object
    Animals(std::string name, int age);
    //Add a new animal record
    void addAnimal(fstream &d);
    //Remove an animal record
    void removeAnimal(fstream &d);
    //Displays an animal through a search
    void searchAnimal(fstream &d);
    //Display ALL animals
    void displayAnimal(fstream &d);
};

#endif

Animals.cpp

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

#include "Animals.h"
using namespace std;

Animals::Animals()
{
    name = "NULL";
    age = 0;
}

Animals::Animals(std::string name, int age)
{
    Animals *newAnimal = new Animals;

}

void Animals::addAnimal(fstream &d)
{
    string userName;
    int userAge = 0;
    int stringRemainder;
    int record;

    const int RECORD_SIZE = 40;

    //Collecting user input
    do
    {
        std::cout << "Please enter your animal name: ";
        std::cin >> userName;
        std::cout << "\n";
    } while (sizeof(userName) > 30);

    do
    {
        std::cout << "Please enter your animal age: ";
        std::cin >> userAge;
        std::cout << "\n";

    } while (userAge <= 0 || !isdigit(userAge));

    //Fixing length of string
    stringRemainder = 30 - sizeof(userName);

    //Finds record number based on position
    record = (d.tellg() % RECORD_SIZE) + 1;

    //Writing to file

    d.close();

    d.open("animals.txt", std::ios_base::app | ios::binary);

    d << record << "";

    d << userName;

    for (int i = 0; i < stringRemainder; i++)
    {
        d << "";
    }

    d << userAge << "\n";

    d.close();


}

void Animals::removeAnimal(fstream &d)
{
    int recordNumber = 0;
    const int RECORD_SIZE = 40;
    char recordBuffer[RECORD_SIZE];

    d.open("animals.txt", ios::out| ios::in |ios::binary);

    //Collecting user input
    do
    {
        cout << "Enter the record of the animal to be removed: ";
        cin >> recordNumber;
    } while (recordNumber <= 0 || !isdigit(recordNumber));

    // move pointer to desired position, and overwrite!
    d.seekp((recordNumber-1) * RECORD_SIZE);
    d.write(recordBuffer, RECORD_SIZE);

    d.close();


}

void Animals::searchAnimal(fstream &d)
{
    int userRecord = 0;
    char displayRecord[2];
    const int RECORD_SIZE = 40;
    char fileOutput[RECORD_SIZE];
    string displayInfo;
    char displayName[RECORD_SIZE];
    char displayAge[2];
    int i,k;
    int j = 0;

    d.open("animals.txt", ios::out | ios::binary);

    //Getting user input
    do
    {
        cout << "Enter the record of the animal to be diplayed: ";
        cin >> userRecord;
    } while (userRecord <= 0 || !isdigit(userRecord));


    //Moving pointer position to searched value
    d.seekp((userRecord - 1) * RECORD_SIZE);
    //Gets data from file, stores into displayInfo
    getline(d, displayInfo);

    d.close();

    //Entering file data into diplay variables, 
    //value 'i' increments through entire displayInfo array

    for (i = 0; isdigit(displayInfo[i]); i++) 
    {
        displayRecord[i] = displayInfo[i];
    }

    //New sentinel for ONLY string cap including buffer
    k = i + 30;

    for (i; i < k; i++) 
    {
        displayName[j] = displayInfo[i];
        j++;
    }

    //Finishes off last of the displayInfo array
    for (i; i < sizeof(displayInfo); i++) {
        displayAge[i] = displayInfo[i];
    }

    //Prints the data for user
    cout << "For record number: " << userRecord << "\n";

    cout << "Animal: ";

    for (int i = 0; i < strlen(displayName); i++)
    {
        cout << displayName[i];
    }
    cout << "\n";

    cout << "Age: ";

    for (int i = 0; i < strlen(displayAge); i++)
    {
        cout << displayAge[i];
    }
    cout << "\n";
}


//Mostly copied from above function, displays ALL animals
void Animals::displayAnimal(fstream &d)
{
    int userRecord = 0;
    char displayRecord[2];
    const int RECORD_SIZE = 40;
    char fileOutput[RECORD_SIZE];
    string displayInfo;
    char displayName[RECORD_SIZE];
    char displayAge[2];
    int numberOfRecords;
    int i, k;
    int j = 0;
    int q = 0;

    d.open("animals.txt", ios::out | ios::in | ios::binary);
    d.seekg(0, d.end);

    numberOfRecords = d.tellg() % RECORD_SIZE;
    d.seekg(0, d.beg);

    for (int q; q < numberOfRecords; q++) {

        d.seekp(q * RECORD_SIZE);

        //Gets data from file, stores into displayInfo
        getline(d, displayInfo);

        //Entering file data into diplay variables, 
        //value 'i' increments through entire displayInfo array

        for (i = 0; isdigit(displayInfo[i]); i++)
        {
            displayRecord[i] = displayInfo[i];
        }

        //New sentinel for ONLY string cap including buffer
        k = i + 30;

        for (i; i < k; i++)
        {
            displayName[j] = displayInfo[i];
            j++;
        }

        //Finishes off last of the displayInfo array
        for (i; i < sizeof(displayInfo); i++) {
            displayAge[i] = displayInfo[i];
        }

        //Prints the data for user
        cout << "For record number: " << userRecord << "\n";

        cout << "Animal: ";

        for (int i = 0; i < strlen(displayName); i++)
        {
            cout << displayName[i];
        }
        cout << "\n";

        cout << "Age: ";

        for (int i = 0; i < strlen(displayAge); i++)
        {
            cout << displayAge[i];
        }
        cout << "\n\n";
    }
    d.close();
}

Upvotes: 0

Views: 212

Answers (2)

monadef
monadef

Reputation: 65

You should use ifstream for read files and ofstream for write files.

And in header file, you should use std::ifstream & d or std::ofstream & d in argument of 4 functions.

Upvotes: 1

sfjac
sfjac

Reputation: 7304

The headers <iostream> and <fstream> bring their symbols into the std namespace, so any reference to these symbols in the header need to be fully qualified; e.g. std::fstream. Also, you might want to include <iosfwd> in your headers instead - this minimizes the compiler time cost of importing the header, assuming that the header only uses reference to the symbols mentioned in the iostream header.

Upvotes: 1

Related Questions