gpt4 book ai didi

c++ - 按照预期的方式使用迭代器、ifstream、ofstream

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:13 25 4
gpt4 key购买 nike

我有一个包含一堆单词的 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(input,line) 部分,有人有更好的主意吗?

最佳答案

正如所写,您的输入循环不正确。 eof 标志是在到达 eof 的读取操作之后设置的,因此您最终可能会经历循环太多次。此外,您无法检查 badfail 标志。有关标志、它们的含义以及如何正确编写输入循环的更多信息,请参阅 Stack Overflow C++ FAQ 问题 Semantics of flags on basic_ios .

readToList 中的循环应如下所示:

std::string line;
while (std::getline(input, line))
{
l.push_back(line);
}

有关执行此操作的更多 C++ 方法,请参阅 Jerry Coffin 对 How do I iterate over cin line-by-line in C++? 的回答他的第一个解决方案非常简单明了,应该可以让您很好地了解这类事情在惯用的 STL 风格 C++ 中的表现。

正如 Tomalak 解释的那样,对于您的 writeFromList 函数,您需要使用两个迭代器。在 C++ 中使用迭代器时,您几乎总是必须成对使用它们:一个指向范围的开头,一个指向范围的结尾。通常最好为迭代器类型使用模板参数,这样您就可以将不同类型的迭代器传递给函数;这允许您根据需要交换不同的容器。

您不需要显式调用 output.close():它由 std::ofstream 析构函数自动调用。

您可以使用 std::copystd::ostream_iterator 将输出循环变成单行:

template <typename ForwardIterator>
bool FileMgr::writeFromList(ForwardIterator first, ForwardIterator last)
{
std::ofstream output("output.txt");

std::copy(first, last, std::ostream_iterator<std::string>(output, ""));
}

关于c++ - 按照预期的方式使用迭代器、ifstream、ofstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com