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);
我正在编写下面的代码,该代码对已排序的文本文件执行二分法搜索。文本文件看起来像这样:
阿默斯·格雷戈里娜 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);