gpt4 book ai didi

c++ - 这个流命令如何在 C++ 中读取整个文件?

转载 作者:行者123 更新时间:2023-11-30 00:44:16 26 4
gpt4 key购买 nike

鉴于此:

auto f = std::ifstream{file};
if (f) {
std::stringstream stream;
stream << f.rdbuf();
return stream.str();
}
return std::string{};

我不明白为什么会这样。我不知道 f 是什么类型,因为它说自动,但显然你可以检查它是否为非零。但是当文件很大时,比如 2 gig,运行延迟发生在这一行:

    stream << f.rdbuf();

文档说 rdbuf() 为您提供指向 ifstream 内部缓冲区的指针。因此,为了让它读取整个文件,缓冲区必须调整文件大小,并一次加载所有文件。但是当流 << 发生时,rdbuf() 必须已经设置,否则它将无法返回一个点。我希望构造函数在这种情况下这样做,但它显然是延迟加载的,因为在构造时读取整个文件对于其他所有用例都是不利的,并且延迟在流 << 命令中。

有什么想法吗?所有其他关于将文件读入字符串的堆栈溢出引用总是以某种方式循环。

如果涉及到一些缓冲区(显然存在),它可以达到多大?如果是1字节怎么办,肯定会很慢。

Adorable c++ 非常不透明,对于必须知道幕后发生的事情的程序员来说是不利的。

最佳答案

它是如何operator<<的函数在 ostream 上定义s 当参数是 streambuf 时.只要streambuf不是空指针,它从 streambuf 控制的输入序列中提取字符并将它们插入 *this直到满足以下条件之一(参见 operator<< overload note #9 ):

  • end-of-file occurs on the input sequence;
  • inserting in the output sequence fails (in which case the character to be inserted is not extracted);
  • an exception occurs (in which case the exception is caught).

基本上,ostream (stringstream 继承自)知道如何练习 streambuf从与其关联的文件中提取所有数据。这是一种惯用的方式,但正如您所注意到的,不是直观的方式来吞噬整个文件。 streambuf实际上并没有在此处缓冲所有数据(正如您所注意到的,在一般情况下将整个文件读入缓冲区会很糟糕),只是它具有必要的连接来将缓冲窗口调整为 ostream要求更多(越来越多)数据。

if (f)工作是因为 ifstreaman overload for operator bool ifstream 的“真实性”时隐式调用经过测试,告诉您文件是否处于故障状态。

关于c++ - 这个流命令如何在 C++ 中读取整个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49546569/

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