我正在尝试搜索文档并找到一个子集来打印出该特定行,但是,它似乎会立即提取整个消息。
ifstream inputFile("searchfile.dat");
int search;
cout << "Enter what you're searching: ";
cin >> search;
string line;
//bool notFound;
while(getline(inputFile, line) /*&& notFound*/){
if (line.find(search)) {
cout << line << endl;
//notFound = false;
}
//line = "";
}
inputFile.close();
这是一项家庭作业,所以我更改了一些变量。回答时请记住这一点(即解释发生了什么,以便我从中学习)
非常感谢!
附言这是我目前正在处理的数据:
Name1 Name1 1000001 12.00
Name2 Name2 1000002 14.00
Name3 Name3 1000004 16.00
我需要搜索 1000000 的号码并仅打印该行。例如,我会搜索 1000002,它会打印: Name2 Name2 1000002 14.00
现在它将打印整个东西
最佳答案
要进行非常基本的修复,请执行此操作
#include<iostream>
#include<fstream>
using namespace std;
int main(){
ifstream inputFile("searchfile.dat");
string search;
cout << "Enter what you're searching: ";
cin >> search;
string line;
while(getline(inputFile, line) ){
if (line.find(search) != string::npos) {
cout << line << endl;
}
}
}
您遇到的问题是双重的。
首先,string::find
不会返回可以在 bool 上下文中正确评估的内容。它返回可以找到该值的索引或以其他方式返回 string::npos
。因此,如果您检查它,它将评估您是否正确。
另一个问题是您将搜索输入为整数,然后尝试在字符串中查找它。结果,它正在调用此 size_type find (charT c, size_type pos = 0) const;
重载 find,它试图找到一个字符。之所以会这样,是因为 int 可以隐式转换为 char。在使用 find
之前,您应该将您的 ID 作为字符串读入或将其转换为字符串。
注意一些其他的事情。这段代码有点脆弱,因为它会在该行的任何位置找到该字符串,因此如果姓名或工资以某种方式包含该值,它就会被发现。您也不需要显式关闭 ifstream
,它在析构函数中关闭。
关于C++ getline() 函数引入整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42015260/