ifstream 没有拉入任何数据

ifstream not pulling any data in

我正在编写下面的代码,该代码对已排序的文本文件执行二分法搜索。文本文件看起来像这样:

阿默斯·格雷戈里娜 5465874526370945

安德森鲍勃 4235838387422002

Legstrong-Cones 迈克 8238742438632892

目前我的构造函数中的 getline(用于调试)正确地提取了第一行数据。但是,当我调用我的 findmethod 时,getline 和带变量的 cs << 都没有拉入数据。我尝试使用指针,getLine 也没有拉入任何数据。我已经对 Whosebug 进行了分类,并进行了一些谷歌搜索以帮助解决这个问题,但似乎无法解决。任何帮助/解释将不胜感激。如果您有任何问题,请告诉我。谢谢!

#include <iostream>
#include <fstream>

using namespace std;

class CardSearch {
protected:
ifstream cs;
public:
int currLength;

CardSearch(string fileName) {
    /* Make sure our file stream opens properly
       pos = current position -> set at 0 to begin
       I use seekg to go to the end of the file and tellg me how many bytes we read to go to the end */

    cs.open(fileName, ios::in);
    if(cs.fail()) {
        cerr << "Failed to open file\n";
        exit(1);
    }

    string dummy;
    getline(cs,dummy); // debug print 
    cout << dummy << endl;

    cs.seekg(0,ios::end);
    currLength= (int)cs.tellg();
}

string find( string lastN, string firstN) {
    string cardNum;
    string currLast = "!!";
    string currFirst = "!!";
    string dummy;

    while (currLast != lastN && currFirst != firstN) {
        currLength = currLength/2;
        if (lastN > currLast) {
            cs.seekg(currLength, ios::cur); // if the lastName given is > where we are, move forward
        } else {
            cs.seekg((-1 * currLength), ios::cur); // // if the lastName given is < where we are, move backward
        }

        cs >> lastN >> firstN >> cardNum;
        cout << currLast << " " << currFirst << " : " << cardNum << endl;
    }

    return cardNum;
}

};

int main(int argc, const char * argv[]) {
    CardSearch instance("StolenNumbers.txt");
    string s = instance.find("Rathbone", "Luke");

    return 0;
}

删除cs.seekg(0,ios::end);

您正在将文件指针设置为文件末尾。因此,没有什么可进一步阅读的。

此外,最好在每次使用流提取时检查它是否正常工作。这就是你的做法..

if ( ! ( cs >> lastN >> firstN >> cardNum ) );
    CallErrorHandlingCode(); // Throw exception, or print to console, or exit program.

如果你像上面那样编写流提取,你会在 运行 时间发现错误。

问题在于:

1)当find开始时,你的文件在末尾,因为你打开它后,你为了读取tellg的大小而寻找它到最后,但是你一直它在最后。那么:

2)

if (lastN > currLast) {
            cs.seekg(currLength, ios::cur); // if the lastName given is > where we are, move forward
        } else {
            cs.seekg((-1 * currLength), ios::cur); // // if the lastName given is < where we are, move backward
        }

如果在第一次测试时应用 else 会起作用,但实际上,if 成功了,因为您将 lastN 初始化为 "Rathbone" 并将 currLast 初始化为 "!!".因此,您试图从文件的末尾进一步查找文件,因此它卡在末尾,您将无法读取任何内容。

解决方案:在构造函数的末尾,查找文件的开头:

cs.seekg(0, ios_base::beg);