为什么我的“ .find”函数给我错误的值?

时间:2018-09-02 20:27:24

标签: c++ string

我正在使用.find函数来获取字符位置,以便对从文本文件读取的行进行一些字符串处理。我觉得我的实现是正确的,但是它给了我一个不可用的整数结果。 的 使用#include <string>标头, 代码部分如下:

ifstream IoTFile;
IoTFile.open("temp_data.txt");
if (IoTFile.is_open())
{
    while (!IoTFile.eof())
    {
        IoTFile >> sLine;
        int pos = sLine.find(",");
        cout << pos;
        //some irrelevant string handling...
    }
}

当我运行程序时,它没有给我任何错误,但是pos的值类似于“ 1111111111111 ....”等,尽管位置12处有一个“,”逗号。这可能正在发生,以及如何解决?

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。让我一一解释:

(1)find在查找char 时效率更高:您的代码搜索单个逗号字符,,因此不需要将字符串作为参数传递给find()调用。使用单引号','代替双引号","将使您的代码更高效:

sLine.find(',');

(2)find不返回int std::string::find()方法返回一个std::string::size_type值。因此,调用find()方法应该是这样的:

std::string::size_type pos = sLine.find(',');

或者您可以简单地使用auto关键字,让编译器为您找到合适的类型

auto pos = sLine.find(',');

(3)检查find 的结果:调用find()后,您必须检查它是否发现了任何东西。您可以通过将结果与std::string::npos值进行比较来做到这一点。如果值相等,那么它什么也没找到。

std::string::size_type pos = sLine.find(',');
if (pos != std::string::npos) {
    std::cout << pos;
}

(4)逐行读取文件:在我看来,您想逐行读取文件,但是您的代码所做的实际上是逐字读取。这就是为什么您的find()呼叫无法正常工作的原因。如果要逐行读取文件,可以执行以下操作:

std::ifstream file("temp_data.txt");
if (file.is_open()) {
    std::string line;
    while (getline(file, line)) {
        std::string::size_type pos = line.find(',');
        // only print pos if the comma was found
        if (pos != std::string::npos) {
            std::cout << line << " - pos = " << pos << '\n';
        }
    }
    file.close();
}