0
1 = 0 0 97 218
2 = 588 0 97 218
3 = 196 438 97 218
4 = 0 657 97 218
5 = 294 438 97 218

上記のようなtxtファイルがあります。=なしでこのファイルから整数のみを読み取るにはどうすればよいですか?

4

2 に答える 2

1

別の可能性は、=空白として分類されるファセットです。

class my_ctype : public std::ctype<char>
{
    mask my_table[table_size];
public:
    my_ctype(size_t refs = 0)  
        : std::ctype<char>(&my_table[0], false, refs)
    {
        std::copy_n(classic_table(), table_size, my_table);
        my_table['='] = (mask)space;
    }
};

次に、ストリームにこのファセットを含むロケールを吹き込み、数値を=まったく存在しないかのように読み取ります。

int main() {
    std::istringstream input(
            "1 = 0 0 97 218\n"
            "2 = 588 0 97 218\n"
            "3 = 196 438 97 218\n"
            "4 = 0 657 97 218\n"
            "5 = 294 438 97 218\n"
        );

    std::locale x(std::locale::classic(), new my_ctype);
    input.imbue(x);

    std::vector<int> numbers((std::istream_iterator<int>(input)),
        std::istream_iterator<int>());

    std::cout << "the numbers add up to: " 
              << std::accumulate(numbers.begin(), numbers.end(), 0) 
              << "\n";
    return 0;
}

確かに、各行の最初の数字は行番号のように見えるため、すべての数字を合計することはおそらくあまり賢明ではありません.問題を引き起こします。

于 2012-05-18T03:22:50.647 に答える
0

基本的なフレームワークは次のとおりです。行ごとに読み取り、解析します。

for (std::string line; std::getline(std::cin, line); )
{
     std::istringstream iss(line);
     int n;
     char c;

     if (!(iss >> n >> c) || c != '=')
     {
         // parsing error, skipping line
         continue;
     }

     for (int i; iss >> i; )
     {
         std::cout << n << " = " << i << std::endl; // or whatever;
     }
}

経由std::cinでファイルを読み取るには、 のようにプログラムにパイプします./myprog < thefile.txt

于 2012-05-17T21:36:00.957 に答える