【发布时间】:2019-12-02 17:32:03
【问题描述】:
我需要做什么?
我需要从 RAM 中读取文件
我是怎么做到的?
我使用std::istream,因为它知道如何从缓冲区中读取。所以,有一种方法知道如何读取文件大小(根据这个 SO 答案https://stackoverflow.com/a/6039648/5709159)
long getFileSize(const std::string &filename)
{
struct stat stat_buf{};
int rc = stat(filename.c_str(), &stat_buf);
return rc == 0 ? stat_buf.st_size : -1;
}
然后我使用 membuf 将字节从文件复制到缓冲区(根据这个 SO 回答 https://stackoverflow.com/a/13586356/5709159)
struct membuf : std::streambuf
{
membuf(char *base, std::ptrdiff_t n)
{
this->setg(base, base, base + n);
}
};
完整实现如下所示
long size = getFileSize(filename);
membuf sbuf(0, size);
std::istream file(&sbuf);
但是,我现在确定 sbuf(0, size); 和 0 是在正确的位置......
所以,问题是 - 如何设置 membuf 的大小合适?
【问题讨论】:
-
你的问题很混乱。
-
@Slava 为什么?我只是想知道是否像我一样设置 membuf,可以吗?
-
因为如果它意味着什么,它的含义与问题本身完全不同。你用过在线翻译吗?
-
@Slava 不,但我也不是母语人士......我改变了问题的标题......
-
第一个参数是缓冲区的开始。您设置为 0,这意味着它将尝试从 RAM 中的零地址读取。那是你要的吗?在大多数操作系统上,它会导致崩溃。