Encore une autre, assez différent, de l'approche: à l'aide d'un paramètre régional qui traite des virgules comme un espace blanc:
#include <locale>
#include <vector>
struct csv_reader: std::ctype<char> {
csv_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[','] = std::ctype_base::space;
rc['\n'] = std::ctype_base::space;
rc[' '] = std::ctype_base::space;
return &rc[0];
}
};
Pour l'utiliser, vous imbue()
un flux de données avec les paramètres régionaux qui comprend cette facette. Une fois que vous avez fait cela, vous pouvez lire les numéros comme si les virgules n'étaient pas là du tout. Juste pour exemple, nous allons lire délimité par des virgules numéros de l'entrée, et à écrire, puis à partir d'un par ligne sur la sortie standard:
#include <algorithm>
#include <iterator>
#include <iostream>
int main() {
std::cin.imbue(std::locale(std::locale(), new csv_reader()));
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::ostream_iterator<int>(std::cout, "\n"));
return 0;
}