从文件中获取信息并放入数组

 收藏

首先,这是一个作业问题,请不要像我那样好好为我做作业...

我必须制作一个程序,可以从文件中搜索库中的作者或标题,并输出所有匹配的行。我很亲近,但现在我的程序唯一能做的就是最后的作者/标题行。这是我的代码:

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


using namespace std;

const int SIZE = 1000;
string bookTitle[SIZE];
string bookAuthor[SIZE];
string filePath;

int loadData(string);
int showAll(string);
int authorSearch(string, string);


int count = 0;

int main(){

// Initialize variables
string userPath;
string searchA;
char userChoice;

// Get the file from the user
cout << "Welcome to the super duper programming library" << endl;
cout << "Enter in a file path: ";
getline(cin, userPath);
cout << endl;

// Call the loadData function
loadData(userPath);

// Create the menu
cout << "How would you like to search the library?" << endl
<< "Q to quit" << endl
<< "S to show all" << endl
<< "A to search by author" << endl
<< "T to search by title" << endl;
cout << "Choice: ";
cin >> userChoice;

// Switch to based on userChoice

switch (userChoice) {
case 'Q':
break;
case 'S':
cout << endl << "There are " << showAll(userPath) << " books in the library";
break;
case 'A':
cout << "Enter in the the author name: ";
cin >> searchA;
cout << endl << authorSearch(searchA, userPath);

}

cout << "Thanks for using Joe's library service";





// Pause and exit
    getchar();
    getchar();
    return 0;
    }

    // loadData opens the specified file, and checks to make sure it is open
    int loadData(string passedPath){
    // Initialize neccesary ifstream variables
    string line;
    ifstream filePath;
    // Open the file
    filePath.open(passedPath.c_str());
    // Return -1 if the file was entered wrong
    if(!filePath.is_open()){
    return -1;
    }

    while (!filePath.eof()){
    getline(filePath,line);
    bookTitle[SIZE] = line;
    getline(filePath,line);
    bookAuthor[SIZE] = line;
    count++;
    }

    // Return 0
    return 0;
    }

    int showAll(string passedPath2){
    // Initialize neccesary variables
    string line;
    ifstream filePath;

    filePath.open(passedPath2.c_str());

    // Put book title and book author into appropriate arrays and display them
    while (!filePath.eof()){

    getline(filePath,line);
    bookTitle[SIZE] = line;
    getline(filePath,line);
    bookAuthor[SIZE] = line;

    cout << bookTitle[SIZE] << " (" << bookAuthor[SIZE] << ")" << endl;
    count++;
    }

    // Return the number of books
    return count / 2;
    }

    int authorSearch(string aSearch, string passedPath3){
    ifstream filePath;
    int j;
    for(j = 0; j < count; j++){

    if(bookAuthor[SIZE] == aSearch){
    cout << bookTitle[SIZE] << " (" << bookAuthor[SIZE] << ")" << endl;
    return j;
    } else {
    cout<< "not found";
    }
    }

    return j + 1;
    }

我知道很多事情,但是有人可以指出我的错误并推动我朝正确的方向发展吗?谢谢。

回复
  • onam 回复

    我的意思是这样的。下一个问题是文件的格式如何?发布一些示例。

        count = 0;
        while(getline(filePath,line)) {
            bookTitle[count] = line;
            count++;
        }
    

  • enemo 回复

    bookTitle [SIZE]

    Every time you specify bookTitle[SIZE] you are specifying the memory just past your bookTitle array. Haven't you been taught about array indecies yet?

    while (!filePath.eof()){ -- See this

    for(i = 0; i < count; i++){ -- Do you actually know the value of count?

  • 头文字D 回复

    count应该是它通过我的!filePath.eof循环的次数,如果我在该循环中两次获得热线电话,则该书数为。

    我知道要访问数组,您需要某种循环来进行遍历,例如:

    for (i = 0; i < 5; i++)
        cout << array[i]
    

    应该显示该数组的5个值,但是当我尝试在搜索功能中执行此操作时,它什么都没有显示,甚至没有最后一本书和作者的组合。

    老实说,我很沮丧。

  • 乐然 回复

    需要将它们读入并行数组。

  • tmodi 回复

    问题是第86和89行。您需要使用一个计数器来计数getline()调用的次数,以便可以将数据放入arrzy的适当项中。将计数器从0开始,并在该读取循环结束时将其递增。

    第108和110行的同上

    我看到您已经有一个名为count的变量-只需使用它,别忘了在这两个循环中的每个循环之前将其重置为0。

  • 沉默U 回复

    有什么特别可以使我的代码看起来更好的东西吗?

    是的,链接。

  • bquia 回复

    我修好了它!我基本上使用了原始代码,但没有使用getline然后使用cin array [SIZE],而是进行了array [count],然后摆脱了所有的[SIZE],并将它们切换为要计数的变量。

    我将仔细阅读您发布的那两个链接。

    有什么特别可以使我的代码看起来更好的东西吗?

    WaltP和AncientDragon,非常感谢您的时间和精力,我真的非常感谢。

  • yvero 回复

    其格式如下: 书作者 书名 书作者 书名

    等等

  • 婚礼洞房 回复

    这是我要做的:

    重来。 步骤1)阅读我发布的链接。

    步骤2)将数据读入数组。将一行插入数组后,将数组条目写入屏幕。考虑一下循环以及何时结束。请参阅步骤1。

    完成阅读后:

    步骤3)循环显示数组的全部内容。确保已读取并正确存储了内容。

    当所有步骤都完成后,继续下一步。

    It will also help greatly if you format your code better.

  • nnam 回复

    while (!filePath.eof()){
            int i = 0;
            int j = 0;
    
            for(i = 0; i < count; i++){
            getline(filePath,line);
            bookTitle[SIZE] = line;
            }
    
            for(j = 0; j < count; j++){
            getline(filePath,line);
            bookAuthor[SIZE] = line;
            }
            count++;
    
        }
    

    因此,根据您的建议,我尝试了此操作,但这一定不是您的意思。。。在增加i ++的同时,我也尝试了一次。我还应该尝试什么?