我试图使用string :: find方法来确定字符串“hello”(前后有空格)是否存在于.txt文件的一行中。如果是的话,它应该打印出行号(位置不重要)。问题是,它找不到字符串。请帮忙。
int main() {
string key (" hello ");
ifstream myReadFile;
myReadFile.open("test.txt");
string s;
int lineCount = 1;
int found;
if (myReadFile.is_open()) {
while (!myReadFile.eof()) {
getline(myReadFile, s);
found = s.find(key);
if(found != string::npos) {
cout<<lineCount<<endl;
lineCount++;
}
}
}
myReadFile.close();
return 0;
}
答案 0 :(得分:2)
如果您遇到的问题是您的程序始终打印1,2,3,...而不是正确的行号,那是因为如果找到子字符串,您只会增加lineCount
;要解决此问题,请将lineCount++
移至if(found != string::npos)
阻止后。
如果您根本没有看到任何输出,则该文件不包含" hello "
(大小写很重要,并且这些空格字符也不会与其他空格匹配)或“test.txt”isn'在正确的地方或名称错误。
注意:此处found
和string::npos
之间的比较正常(即使其中一个是签名int
而另一个是size_t
(可能是unsigned int
或者可能{64}系统上的unsigned long long
。有趣的是,如果您将found
更改为unsigned int
并且size_t
恰好是更宽的无符号类型,它将会中断(在32位计算机上,您可以通过found
unsigned short
来模拟这种情况。由于您实际上并未使用found
的值,因此最好完全避免转换并且只做if (s.find(key) != string::npos)
。
答案 1 :(得分:0)
int found
应为string::size_type
。这可能是您的问题,因为int已签名且size_t未签名。有关详细信息,请参阅string::npos。
npos是静态成员常量值 最大可能的价值 size_t类型的元素。
编辑:
感谢Martin的评论,我将size_t
替换为string::size_type
答案 2 :(得分:0)
它似乎正在做的就是计算其中包含该字符串的行数。你应该在循环的每次迭代中增加行号var,而不仅仅是在找到字符串时。
int main() {
std::string key (" hello ");
ifstream myReadFile;
myReadFile.open("test.txt");
if (myReadFile) {
std::string line;
int line_number = 0;
while (std::getline(myReadFile, line)) {
line_number++;
if (line.find(key) != std::string::npos)
std::cout << line_number << std::endl;
}
} else {
std::cout << "Error opening file\n";
}
}