gpt4 book ai didi

c++ - 为 std::ifstream 表达 "read-only, no modification of position"

转载 作者:行者123 更新时间:2023-11-28 00:34:38 32 4
gpt4 key购买 nike

在我的代码中,我想在决定如何读取文件之前识别文件内容的一些属性。 (也就是说,我搜索一个关键字,如果找到,它将用 foo(std::ifstream&) 读取,否则用 bar(std::ifstream&) ).

我实现了搜索关键字的方法为

bool containsKeyword(std::ifstream& file, const char* keyword)
{
for ( std::string line; std::getline(file, line); )
{
if ( line == keyword )
{
return true;
}
}
return false;
}

这会修改文件流的位置(如果没有找到关键字,则为结尾,或者关键字的位置)。但是我希望在搜索后重置位置。这可以通过 ScopeGuard 完成:

class FilePositionScopeGuard
{
private:
std::ifstream& file;
using FilePosition = decltype(std::declval<std::ifstream>().tellg());
FilePosition initial_position;
public:
FilePositionScopeGuard(std::ifstream& file_)
:
file(file_),
initial_position(file.tellg())
{
}
~FilePositionScopeGuard()
{
file.clear();
file.seekg(initial_position);
}
};

现在我们将其添加到方法中:

bool containsKeyword(std::ifstream& file, const char* keyword)
{
FilePositionScopeGuard guard(file);
for ( std::string line; std::getline(file, line); )
{
...

这很好,因为在方法中只增加了一行,我们得到了不修改 std::ifstream 的行为,无论方法如何退出(返回或异常之一) ).

但是,方法bool containsKeyword(std::ifstream&, const char*); 没有表达constness。我如何调整我的方法以表达(在界面级别)该方法不会改变当前状态?

最佳答案

您可以更改签名以采用位置保护文件:

bool containsKeyword(const FilePositionScopeGuard &, const char *);

这允许调用者根据当前签名传递一个 ifstream(为该操作构建一个临时守卫),或者创建他们自己的守卫并将其用于多个操作。

您需要使 ifstream 成员可公开访问。

关于c++ - 为 std::ifstream 表达 "read-only, no modification of position",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21456438/

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