0

int number 是此代码来自的函数的参数。 first_digit是一个字符串,它已从 ifstream 文件中传递了第一个值

else if (number != 0)
    {
        std::string number_string = std::to_string(number);
            while (!file.eof() )
            {
                if (first_digit[0] == number_string)
                {
                    count++;
                }
            file >> first_digit;
            }

我要做的是让count++文件中的第一个数字与 parameter 的 char 值匹配int number。AKA 我正在尝试计算第一个数字匹配的行numbernumber从将发送数字的单独函数传递,for(i=1;1<10;i++)因此我将以文件中第一个数字为 1、2、3 等的次数的总和结束

我正在努力的是有条件的!我如何将字符串 first_digit 的第一个索引位置与 int n 关联起来,因为它们具有相同的 char 值?例如'1' == '1'因此count++

4

3 回答 3

0

数字字符的数值保证是递增和连续的。换句话说,我相信你正在寻找这个:

if (first_digit[0] == '0' + number) {
  //...
}
于 2013-10-04T16:42:08.520 回答
0

您尝试做的事情只有number在 0 到 9 之间才有效。此外,如果first_digit是 a string,那么first_digit[0]是 a char,然后您尝试将其与 a 进行比较string(这将不起作用)。

else if (number > 0 && number <= 9) // no sense in checking larger numbers unless you convert the base
{
    std::string number_string = std::to_string(number);
    std::string line;
    while (std::getline(file, line))
    {
        if (line[0] == number_string[0])
        {
            count++;
        }
    }
}

或者,或者,您可以使用std::count_if为您完成所有操作,而不是编写自己的循环。它看起来类似于以下内容(注意:尚未调试):

struct line_reader : std::ctype<char>
{
    line_reader() : std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
        rc['\n'] = std::ctype_base::space;
        return &rc[0];
    }
};

// in your conditional

else if (number > 0 && number <= 9) // no sense in checking larger numbers unless you convert the base
{
    std::string number_string = std::to_string(number);
    line_reader myReader;
    file.imbue(std::locale(std::locale(), myReader));
    count = std::count_if(std::istream_iterator<std::string>(file), std::istream_iterator<std::string>(), [&](const string& s)
    {
        return s[0] == number_string[0];
    });
}
于 2013-10-04T16:55:03.133 回答
0

首先,您的示例代码存在一些问题。在 C++ 中,EOF 位仅您读取文件末尾之后的内容后设置。这意味着您将始终使用您的代码阅读一个垃圾行。相反,您应该在处理之前检查您读取的数据是否确实有效。(请参阅为什么循环条件内的 iostream::eof 被认为是错误的?

此外,您应该使用std::getline来读取整行,而不仅仅是下一个空格字符。

现在谈谈你的实际问题。如果你知道这个数字总是小于 10,你可以使用这个技巧:

char digit = '0' + number

这是因为每个数字字符的数值总是比前一个大一。例如,'1'数字字符的数值是'0' + 1,依此类推。

通过这些更改,最终代码为:

// Assert that the number is in the required range. 
assert(number < 10 && number >= 0 && "Expected a single digit!");
std::string line;
while(std::getline(file, line)) {
  if(line[0] == '0' + number) {
    ++count;
  }
}
于 2013-10-04T16:59:24.860 回答