gpt4 book ai didi

c++ - 使用 istreambuf_iterator<> 将文件内容转换为字符串流

转载 作者:行者123 更新时间:2023-11-28 00:56:29 27 4
gpt4 key购买 nike

我正在使用以下代码(使用命名空间 std)将文件内容转换为字符串。

代码 1

string fileToString(const string& filename)
{
ifstream file(filename, ios::binary);
if (!file) return "";
string str(istreambuf_iterator<char>(file),
(istreambuf_iterator<char>()));
return str;
}

我发现上面的代码有效(我将 string::size() 与 Windows 资源管理器中找到的实际文件大小相匹配)很奇怪,但以下代码无效:

代码 2

string fileToString(const string& filename)
{
ifstream file(filename, ios::binary);
if (!file) return "";
string str(istreambuf_iterator<char>(file),
istreambuf_iterator<char>());
return str;
}

请注意第二个参数周围缺少的括号。第二个函数给出以下编译器错误:

1 error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,Ax> &)' : cannot convert parameter 1 from 'std::string (_cdecl *)(std::istreambuf_iterator<_Elem,_Traits>,std::istreambuf_iterator<_Elem,Traits> (_cdecl *)(void))' to 'const std::basic_string<_Elem,_Traits,_Ax> &'

2 IntelliSense: no suitable constructor exists to convert from "std::string (std::istreambuf_iterator> file, std::istreambuf_iterator> (*)())" to "std::basic_string, std::allocator>"

我在 Windows XP SP3 上使用 Visual Studio 2010,Win32 控制台应用程序。

令我惊讶的是,以下代码编译并按预期工作:

代码 3

string fileToString(const string& filename)
{
ifstream file(filename, ios::binary);
if (!file) return "";
return string(istreambuf_iterator<char>(file),
istreambuf_iterator<char>());
}

为什么Code 2会产生编译错误?

最佳答案

Why does Code 2 produce compiler error?

代码 2 产生编译错误,因为在代码 2 中,以下行声明了一个函数:

string str(istreambuf_iterator<char>(file),
istreambuf_iterator<char>());

它声明了一个函数。函数名称是str .返回类型是 string .该函数有两个参数:

  • 第一个参数的类型是istreambuf_iterator<char> .
  • 第二个参数的类型是istreambuf_iterator<char> (*)()这是返回 istreambuf_iterator<char> 的函数指针类型并且不接受任何争论。

因此在代码 2 中,您返回一个名为 str 的函数.由于不能转换成string这是函数的返回类型 fileToString ,因此它给出了编译错误。

在 Code1 和 Code3 中,没有这样的问题,因此它们按预期工作。

关于c++ - 使用 istreambuf_iterator<> 将文件内容转换为字符串流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10994602/

27 4 0
文章推荐: javascript - 将变量传递到符合 W3C 的外部 js 文件中
文章推荐: python - 使用 lxml 合并来自两个段落的 HTML 内容
文章推荐: javascript - 单击按钮刷新
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com