#include <boost/assign.hpp>
#include <map>
#include <string>
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <locale>
using boost::assign::map_list_of;
/*
Консольное приложение, должно, считывая текст из файла, вывести его на экран, при этом заменяя цифры от 0 до 9 на слова "один", "два"...
каждое новое предложение должно начинаться с новой строки.
Заранее благодарю за помощь!
*/
struct line
{
typedef std::string value_type;
friend std::istream& operator>> (std::istream& s, line& l)
{
std::getline(s, l.buf_);
return (s);
}
friend std::ostream& operator<< (std::ostream& s, const line& l)
{ return s << l.buf_; }
line() {}
line(const value_type& s) : buf_(s) {}
const value_type& str() const { return (buf_); }
value_type buf_;
};
template <typename T>
struct replacer : public std::unary_function<T, T>
{
typedef typename T::value_type value_type;
typedef typename value_type::const_iterator const_iterator;
typedef std::map<char, value_type> corrections_table;
const corrections_table corrections_;
replacer() : corrections_(map_list_of
('0', "ноль")('1', "один")('2', "два")('3', "три")('4', "четыре")
('5', "пять")('6', "шесть")('7', "семь")('8', "восемь")('9', "девять")) {}
T operator () (const T& v) const
{
value_type r;
const value_type& s = v.str();
for (const_iterator i = s.begin(); i != s.end(); ++i)
{
corrections_table::const_iterator found = corrections_.find(*i);
if (found != corrections_.end())
r.append(found->second);
else
r += *i;
}
return r;
}
};
int main()
{
std::ifstream ifs("in.txt");
std::ofstream ofs("out.txt");
std::transform(
std::istream_iterator<line>(ifs),
std::istream_iterator<line>(),
std::ostream_iterator<line>(ofs, "\n"),
replacer<line>());
return (0);
}
Работа с файлами и строками (MSVC++)
каждое новое предложение должно начинаться с новой строки.:(
Заранее благодарю за помощь!
поюзал boost, ибо влом инициализировать мапу вручную...