如果该单词不包含元音,我正在尝试将单词复制到文件中。这是我的尝试,但它不起作用。它将单词复制到文件中,但不排除带元音的单词。我不知道为什么它会输出它的作用......
#include <iostream>
#include <string>
#include <sstream>
#include <cctype>
#include <fstream>
#include <vector>
template <typename It>
bool has_vowel(It begin, It end)
{
for (auto it = begin; it != end; ++it)
{
char lower = std::tolower(*it);
if (lower == 'a' || lower == 'e' ||
lower == 'i' || lower == 'o' || lower == 'u')
return true;
}
return false;
}
int main()
{
std::fstream in("in.txt");
std::fstream out("out.txt");
std::vector<std::string> v;
std::string str;
while (in >> str)
{
v.push_back(str);
}
for (auto it = v.begin(); it != v.end(); ++it)
{
if (!has_vowel(it->begin(), it->end()))
out << *it << " ";
}
}
in.txt
你好我的朋友和家人
输出到out.txt
myllofriendsandfamily
答案 0 :(得分:3)
---使用noskipws
---
实际上那是一个思想家。这是使用C ++ 11进行的最小返工。我希望你能从中收集一些有用的东西:
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
template <typename It>
bool has_vowel(It begin, It end)
{
while (begin!=end)
{
char lower = std::tolower(static_cast<unsigned char>(*begin));
if (lower == 'a' || lower == 'e' ||
lower == 'i' || lower == 'o' || lower == 'u')
return true;
++begin;
}
return false;
}
int main()
{
std::istream_iterator<std::string> f(std::cin), l;
for (auto& s : std::vector<std::string>(f, l))
{
if (!has_vowel(s.begin(), s.end()))
std::cout << s << " ";
}
}
或者,避免使用矢量:
#include <algorithm>
int main()
{
std::istream_iterator<std::string> f(std::cin), l;
for_each(f, l, [] (std::string const& s) {
if (!has_vowel(s.begin(), s.end()))
std::cout << s << " ";
});
}
答案 1 :(得分:3)
除非你感到受虐待,否则使用find_first_of
编码元音检查几乎肯定要容易得多:
struct has_vowel {
bool operator()(std::string const &a) {
static const std::string vowels("aeiouAEIOU");
return a.find_first_of(vowels) != std::string::npos;
}
};
如果要复制某个容器,但排除符合条件的项目,通常需要使用std::remove_copy_if
。由于这可以直接与istream_iterator
和ostream_iterator
一起使用,因此您无需在执行此任务时将所有单词存储在向量中:
std::remove_copy_if(std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(out, " "),
has_vowel());
如果您愿意使用C ++ 11,则可以使用lambda作为条件:
std::remove_copy_if(std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(out, " "),
[](std::string const &s) {
return s.find_first_of("aeiouAEIOU") != std::string::npos;
});
答案 2 :(得分:2)
您正在错误地打开输出文件。 std::fstream
不会丢弃该文件的旧内容。请改用std::ofstream
。