如何从RAM中读取?

How to read from RAM?

我需要做什么?

我需要从 RAM 中读取文件

我是怎么做到的?

我使用std::istream,因为它知道如何从缓冲区读取。所以,有一种方法知道如何读取文件大小(根据这个 SO answer )

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 回答 )

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 设置为正确的大小?

据我了解你的问题,你想读取一个文件。

您需要了解您程序的每个变量都存储在您的内存中。所以对于 "read a file from ram" 你只是像往常一样阅读你的文件。

如果问题是关于将文件存储在您的 ram 中以便稍后在另一个程序中使用它,那是不正确的。从需要它的程序中读取文件。

选项 1

扩展您问题中的代码:

long size = getFileSize(filename);
std::vector<char> buffer(size);
// here fill the buffer with data
membuf sbuf(buffer.data(), buffer.size());
std::istream file_from_ram(&sbuf);

如果您想用某个文件的内容填充缓冲区,请执行以下操作:

std::istream original_file("filename.dat");
original_file.read(buffer.data(), size);

注意:该方法存在问题。首先,正如@andrew-henle 在评论中提到的,off_t 类型的文件大小可能不会填入 long。其次,此方法存在 TOCTOU(检查时间 -- 使用时间)问题:如果文件大小在调用 getFileSize 和读取文件之间发生变化,您可能会遇到麻烦。

选项 2

改用std::istringstream

std::string buffer;
// here fill the string with data
std::istringstream file_from_ram(buffer);

如果您想用某个文件的内容填充缓冲区,请执行此操作(来自 ):

std::ifstream original_file("filename.dat");

std::istringstream file_from_ram;
file_from_ram << original_file.rdbuf();
// Now you can read from file_from_ram