gpt4 book ai didi

c++ - 如何从RAM中读取?

转载 作者:行者123 更新时间:2023-11-30 04:45:37 24 4
gpt4 key购买 nike

我需要做什么?

我需要从内存中读取文件

我是怎么做到的?

我使用 std::istream,因为它知道如何从缓冲区读取。所以,有一种方法知道如何读取文件大小(根据这个 SO answer 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 answer 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 设置为正确的大小?

最佳答案

选项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);

如果您想用某个文件的内容填充缓冲区,请执行此操作(来自 https://stackoverflow.com/a/116220/4451432 ):

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

关于c++ - 如何从RAM中读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57185003/

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