如何计算一行中以分隔符分隔的字符串的数量

时间:2019-03-03 14:18:49

标签: c++ delimiter-separated-values

我有一个看起来像这样的文件:

2,1,4,6,7
1,2,3,6,5

我必须在忽略逗号的情况下在一行中计数数字。例如,第一行有5位数字,第二行也有5位数字。每行中的位数可能会有所不同。我使用getline和逗号分隔符。但是,如果这样做,我不知道行何时结束。我编写的代码将为我计算整个文件的数量。我想要的是一种在一行中计算数字的方法。我该怎么办?

numberofdigits = 0;

while(!friendsFile.eof())
{       
    getline(friendsFile,counts,',');
    intcounts = stoi(counts);
    cout << intcounts;
    numberofdigits++;
}

1 个答案:

答案 0 :(得分:0)

逐行阅读并在std::stringstream的帮助下组合您的解决方案:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

int main() {
    std::ifstream input{"input.txt"};

    if(!input) {
        std::cerr << "Failed to open the file\n";
        return 1;
    }

    std::size_t line_number = 0;
    std::istringstream stream{};

    for(std::string line{}; std::getline(input, line); stream.clear()) {
        stream.str(line);
        std::size_t count = 0;
        std::string number{};

        while(std::getline(stream, number, ',')) {
            ++count;
        }

        std::cout << "Line " << line_number++ << " contains " << count << " digits\n";
    }
}

确保成功打开文件后,就可以开始处理文件了。

首先,请注意for()循环。我们使用line字符串来保存从文件中读取的行。循环的条件也是 我们读取该行的部分。 std::getline不仅读取一行,还从读取的地方返回该流。可以将该流隐式转换为bool,以检查该流是否处于有效状态。这样,我们将逐行读取 文件,并确保如果出现问题(即到达文件末尾),我们将不会进入循环并使用它,因为它可能已损坏,数据。使用此方法与almost always wrong!file.eof()之间存在很大的差异。

然后,在读取一行之后,我们用它初始化一个std::istringstream对象。字符串流是有用的帮助程序,它使我们能够像对待流一样操作文本。我们再次使用std::getline,但是这次提取所有用','分隔的标记。

在处理一行之后,stream.clear()部分必不可少,因为它清除了流的所有不良状态(即,到达文件末尾的状态-在我们的情况下,是在读取整行之后)。

我们计算成功提取的次数并将其显示在屏幕上。