如何从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
我需要做什么?
我需要从 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