函数头和函数重载的多个错误

时间:2017-10-15 00:53:31

标签: c++ function header overloading fstream

这是我第一次使用C ++中的类和头文件,我把代码放在一起后遇到了这些错误

  • 函数不带1个参数//对于所有4个函数
  • 在'Animals'中找不到重载的成员函数//也适用于所有4 fncs
  • 语法错误:标识符'fstream'//标题文件错误

该程序旨在读取和写入文件,同时还可以进行搜索并能够操作二进制文件。我很确定错误出现在我的声明中,但我自己无法弄明白;任何帮助表示赞赏。

的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();
}

2 个答案:

答案 0 :(得分:1)

标头<iostream><fstream>将其符号带入std命名空间,因此标头中对这些符号的任何引用都需要完全限定;例如std::fstream。此外,您可能希望在标头中包含<iosfwd> - 这可以最大限度地减少导入标头的编译器时间成本,假设标头仅使用对iostream标头中提到的符号的引用。

答案 1 :(得分:1)

您应该将ifstream用于读取文件,将ofstream用于写入文件。

在头文件中,您应该在4个函数的参数中使用std::ifstream & dstd::ofstream & d