string :: find找不到匹配项

时间:2011-06-06 02:49:31

标签: c++ string

我试图使用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;
}

3 个答案:

答案 0 :(得分:2)

如果您遇到的问题是您的程序始终打印1,2,3,...而不是正确的行号,那是因为如果找到子字符串,您只会增加lineCount;要解决此问题,请将lineCount++移至if(found != string::npos)阻止后。

如果您根本没有看到任何输出,则该文件不包含" hello "(大小写很重要,并且这些空格字符也不会与其他空格匹配)或“test.txt”isn'在正确的地方或名称错误。

注意:此处foundstring::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";
    }
}