使用迭代器,ifstream,ofstream意图完成它的方式

时间:2011-03-19 03:27:11

标签: c++ file-io coding-style iterator fstream

我有一个包含一堆单词的txt文件,每行一个。 我需要阅读这个文件并将每个单词放在一个列表中 然后用户将能够修改此列表 完成编辑后,程序会将修改后的列表写入新文件中。

由于它是c ++的对象,我将有两个类,一个用于读/写文件,另一个用于编辑/混淆列表和用户。

考虑到这种方法,这是我在第一堂课中的阅读功能:

bool FileMgr::readToList(list<string> &l)
{
if(!input.is_open())
    return false;

string line;
while(!input.eof())
{
    getline(input, line);
    l.push_back(line);
}
return true;
}

请记住:输入是在构造函数中打开的。 问题:是否有一种不那么多余的方法可以从istream中获取该死的线并将其推回l? (中间没有'字符串')。 除了问题,这个功能似乎运作正常。

现在输出功能:

 bool FileMgr::writeFromList(list<string>::iterator begin, list<string>::iterator end)
{
    ofstream output;
    output.open("output.txt");
    while(begin != end)
    {
        output << *begin << "\n";
        begin++;
    }
    output.close();
    return true;
}

这是我主要的一部分:

    FileMgr file;
list<string> words;
file.readToList(words);
cout << words.front() << words.back();
list<string>::iterator begin = words.begin();
list<string>::iterator end = words.end();
file.writeFromList(begin, end);

感谢您的帮助,这两个功能现在都有效。 现在关于样式,这是实现这两个功能的好方法吗? getline(输入,线)部分我真的不喜欢,有人有更好的主意吗?

2 个答案:

答案 0 :(得分:6)

如上所述,您的输入循环不正确。 在读取操作达到eof之后设置 {1>},因此您可能会多次通过循环。此外,您无法检查eofbad标志。有关标志,它们的含义以及如何正确编写输入循环的更多信息,请参阅Stack Overflow C ++ FAQ问题Semantics of flags on basic_ios

fail中的循环应如下所示:

readToList

有了更多的C ++方法,请参阅Jerry Coffin对How do I iterate over cin line-by-line in C++?的回答。他的第一个解决方案非常简单,并且应该让您对习惯性的STL风格的C ++有一个很好的了解。

对于你的std::string line; while (std::getline(input, line)) { l.push_back(line); } 函数,正如Tomalak解释的那样,你需要使用两个迭代器。在C ++中使用迭代器时,几乎总是必须成对使用它们:一个指向范围的开头,一个指向范围的结尾。通常也可以使用模板参数作为迭代器类型,以便可以将不同类型的迭代器传递给函数;这允许您根据需要交换不同的容器。

您无需显式调用writeFromListoutput.close()析构函数会自动调用它。

您可以将std::ofstreamstd::copy一起使用,将输出循环转换为一行:

std::ostream_iterator

答案 1 :(得分:2)

writeFromList应该使用一个启动迭代器和一个结束迭代器。这种基于范围的方法是迭代器的设计方法,它是stdlib如何使用它们。

所以:

bool FileMgr::writeFromList(list<string>::iterator it, list<string>::iterator end)
{
    ofstream output("output.txt");

    for (; it != end; ++it)
        output << *it;

    return true;
}

file.writeFromList(words.begin(), words.end());

您会注意到我的流使用量也有所改善。

理想情况下writeFromList是通用的,并且任何迭代器类型。但这是未来的工作。

另请注意your .eof is wrong。这样做:

string line;
while (getline(input, line))
    l.push_back(line);