在标头C ++中写入文件

时间:2018-07-29 20:58:46

标签: c++

我有3个文件,book.h,book.cpp,bookdriver.cpp。我想知道是否使用二进制搜索在数组中找到了列表中的ISBN。

book.h:

using namespace std;
ofstream fout("output2.txt");
class Book
{
    string author;          // A string for the name of the author
    string title;           //A string for the book title
    int ISBN;               //A long integer for the ISBN

    public:
        Book();                         //A default constructor
        void print();
        int getISBN() const;            //A const function GetISBN that returns the integer containing the ISBN.
        int binary_search(Book, int, int, int);
};

book.cpp-还包括使用fout的打印功能

#include "book.h"
   //iterative binary search function, returns location of ISBN in array if present
int Book::binary_search(Book arr[], int x, int n, int ISBN)
{
    while (n >= x)
    {
        int midpt = x + (n - x) / 2;
        //if ISBN is in midpoint
        if (arr[midpt].getISBN() == ISBN)
        {
            return midpt;
        }
        //if ISBN is greater than midpoint, ignore left side of array
        if (arr[midpt].getISBN() < ISBN)
        {
            x = midpt + 1;
        }
        //if ISBN is smaller, ignore right side of array
        else
        {
            n = midpt - 1;
        }
    }

    //if ISBN not present
    return -1;
}

bookdriver.cpp

#include "book.h"

const int num = 10; //number of book objects the array should hold *can be changed*
int main()
{
    Book book_array[num] = {};  //array can hold num book objects

    for (int c = 0; c < num; c++)
    {
        book_array[c] = Book();
        book_array[c].getData(data);        //reading book information
    }

    //read file
    ifstream fin("bookISBN.txt");
    int find_ISBN;

    while (fin >> find_ISBN)
    {
        bool match = false;
        int count = 0;
        int result = binary_search(book_array[10], 0, num - 1, find_ISBN); //error here


        if (result == -1)   //if ISBN not found
        {
            fout << "Sorry, the ISBN " << find_ISBN << " is not found." << endl;
        }
        else
        {
            fout << "The ISBN " << find_ISBN << " is found in the system!" << endl;
        }
        count++;

    }
    return 0;
}

我在book.cpp和bookdriver.cpp中都使用fout,因此标头中有ofstream fout (output2.txt),但是在vs中出现链接器错误(错误LNK2005)。

我认为由于一个定义规则,fout被定义了两次?

1 个答案:

答案 0 :(得分:0)

这是一个开始:

#include <iostream>
#include <fstream>
using namespace std;

const int num = 2;

class Book
{
public:
    Book(){};
    string author;
    string title;
    int ISBN = 0;
    int data;
};

int binary_search (Book arr[num], int x, int n, int ISBN, int overflow)
{
    int mid = (x + n) / 2;

    if (x == mid || n == mid)
        overflow++;

    if (overflow > 100)
        return false;

    if (arr[mid].ISBN > ISBN)
        return binary_search(arr, x , mid, ISBN, overflow);

    else if (arr[mid].ISBN < ISBN)
        return binary_search(arr, mid, n , ISBN, overflow);

    return true;
}

int main() {

    ofstream fout("output2.txt");
    ifstream fin("bookISBN.txt");

    int find_ISBN;

    Book book1;
    book1.title = "Alice in Wonderland";
    book1.author = "C.S. Lewis";
    book1.ISBN = 1;

    Book book2;
    book2.title = "Wuthering Heights";
    book2.author = "Emily Bronte";
    book2.ISBN = 2;

    Book book3;
    book3.title = "Moby Dick";
    book3.author = "Herman Melville";
    book3.ISBN = 25;

    Book book_array[num] = {book1, book2};

    while (fin >> find_ISBN)
    {
        int result = binary_search(book_array, 0, num, find_ISBN, 0);

        if (result == false)
        {
            fout << "Sorry, the ISBN " << find_ISBN << " is not found." << endl;
        }
        else
        { 
            fout << "The ISBN " << find_ISBN << " is found in the system!" << endl;
        }
    }

    fin.close();
    fout.close();

    return 1;
}