0

int number は、このコードの元になる関数のパラメーターです。 first_digitifstream ファイルから最初の値が渡された文字列です

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などである回数の合計で終了します

私が苦労しているのは条件です!同じ char 値を保持していることに基づいて、文字列 first_digit の最初のインデックス位置を int n に関連付けるにはどうすればよいですか? 例えば'1' == '1'だからcount++

4

3 に答える 3

0

まず、サンプル コードにはいくつかの問題があります。C++ では、EOF ビットは、ファイルの末尾を超えて何かを読み取った後にのみ設定されます。これは、コードで常に 1 つのジャンク行を読み取ることを意味します。代わりに、読み取ったデータが実際に有効かどうかを処理する前に確認する必要があります。(ループ条件内の iostream::eof が間違っていると見なされるのはなぜですか?を参照してください) 。

また、次の空白文字だけでなく、行全体を読み取るためにstd::getlineを使用する必要があります。

次に、実際の問題に進みます。数値が常に 10 未満であることがわかっている場合は、次のトリックを使用できます。

char digit = '0' + number

これが機能するのは、各数字文字の数値が常に前の数値よりも 1 大きいためです。たとえば、数字の数値は などになり'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 に答える
0

数字文字の数値は、増加し、連続していることが保証されています。言い換えれば、私はあなたがこれを探していると信じています:

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

あなたがやろうとしていることは、 が 0 から 9 の間の場合にのみ機能numberします。first_digitstringfirst_digit[0]charstring

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 に答える