搜索并行数组

Searching parallel arrays

本文关键字:数组 并行 搜索      更新时间:2023-10-16

我的程序设计用于从包含标题和作者列表的文件中获取输入。文件看起来像这样:

<>之前标题有关作者下一个冠军有关作者等。之前

我的问题是我的showBooksByTitle和showBooksByAuthor函数。现在这段代码只返回精确匹配,还输出一个空换行符和一个带有空格和()的新行。

当然,任何帮助都是非常感激的。这是我第一年编程。我包含了整个代码只是为了安全,我没有遗漏任何可能的问题。
#include <iostream>
#include<string>
#include<fstream>
#include<cstring>
using namespace std;
struct Book {
    string title;
    string author;
};
const int ARRAY_SIZE = 1000;
Book books [ARRAY_SIZE];
int loadData (string);
void showAll (int);
int showBooksByAuthor (int, string);
int showBooksByTitle (int, string);
int main() {
    //Declare variables
    string pathname;
    string title;
    string name;
    string word;
    int count;
    char response;
    //ask user for pathname
    cout << "What is the path of the library file? ";
    cin >> pathname;
    cout << endl;
    count = loadData(pathname);
    //input data into arrays
    loadData(pathname);
    cout << endl << count << " records loaded successfully." << endl << endl;
    //Show user menu
    cout << "Please enter Q to Quit, A to search for the Author, T to search for the Title, "
    << endl << "or S to Show all: ";
    cin >> response;
    switch(response) {
        case 'q':
            break;
        case 'Q':
            break;
        case 'a':
            cout << endl << "Please enter author's name: ";
            cin >> name;
            showBooksByAuthor(count, name);
            break;
        case 'A':
            cout << endl << "Please enter author's name: ";
            cin >> name;
            showBooksByAuthor(count, name);
            break;
        case 't':
            cout << endl << "Please enter all or part of the title: ";
            cin >> title;
            showBooksByTitle(count, title);
            break;
        case 'T':
            cout << endl << "Please enter all or part of the title: ";
            cin >> title;
            showBooksByTitle(count, title);
            break;
        case 's':
            cout << endl;
            showAll(count);
            break;
        case 'S':
            cout << endl;
            showAll(count);
            break;
        default:
            cout << endl << "Invaled input, please try again: ";
            break;
    }
    //pause and exit
    cout << endl;
    system("PAUSE");
    return 0;
}

int loadData(string pathname) {
    int i = 0;
    int j = 0;
    ifstream library;
    //open file, if not successful, output error message
    library.open(pathname.c_str());
    if (!library.is_open()) {
        cout << "Unable to open input file." << endl;
        return -1;
    }
    //reads title and author from file into designated string
    //this is assuming title comes first and author comes after
    while(!library.eof()) {
        getline(library, books[i].title);
        getline(library, books[i].author);
        i++;
    }
    return i;
}
void showAll (int count) {
    for (int i = 0; i < count; i++) {
        cout << books[i].title << " (" << books[i].author << ")" << endl;
    }
}
int showBooksByAuthor(int count, string name) {
    int found;
    for(int n = 0; n < 28; n++) {
        found = name.find(books[n].author);
        if(found != string::npos) {
            cout << endl << books[n].title << " (" << books[n].author << ")" << endl;
        }
    }
    return 0;
}

int showBooksByTitle (int count, string title) {
    int found;
    for(int n = 0; n < 28; n++) {
        found = title.find(books[n].title);
        if(found !=string::npos) {
            cout << endl << books[n].title << " (" << books[n].author << ")" << endl;
        }
    }
    return 0;
}

意外的输出是因为您错误地读取了数据文件。直到之后才设置流的EOF标志,所以循环迭代一次到多次。

loadData中的循环更改为:

while(getline(library, books[i].title) && getline(library, books[i].author))
    i++;

这使用了std::getline返回流的事实,并且流可以用作真/假值。

Joachim已经指出了主要问题。我想补充一些评论:

  1. c++有一个可变长度数组,std::vector。它还有一个链表和其他容器。所以不要把这些书做成固定的数组,而是使用一些标准的容器。
  2. 使用迭代器迭代,而不是索引。对于数组指针是迭代器(c++ 11有end()函数获取指针刚刚超过数组的结束;在c++ 03中编写是很简单的,但是你不应该使用普通的旧数组)。
  3. 您正在查找输入字符串中的图书名称/书名。如果你想要子字符串匹配,你应该用另一种方式来做。