2

如果该单词不包含元音,我正在尝试将单词复制到文件中。这是我的尝试,但它不起作用。它将单词复制到文件中,但不排除带有元音的单词。我不确定为什么它会输出它所做的事情......

#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 << " ";
    }
}

在.txt

你好我的朋友和家人

输出到 out.txt

我的朋友和家人

4

3 回答 3

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 << " ";
    }
}

现场观看:http: //ideone.com/1tYfs2

或者,避免向量:

#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 << " ";
        });
}
于 2013-06-21T21:43:04.577 回答
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;
                    });
于 2013-06-21T21:50:18.473 回答
2

您打开输出文件不正确。std::fstream不会丢弃文件的旧内容。改为使用std::ofstream

于 2013-06-21T21:55:53.330 回答