C++ 如何从RAM中读取数据?

C++ 如何从RAM中读取数据?,c++,file,buffer,istream,C++,File,Buffer,Istream,我需要做什么 我需要从RAM中读取文件 我是怎么做的 我使用std::istream,因为它知道如何从缓冲区读取数据。所以,有一种方法知道如何读取文件大小(根据这个答案) 然后我使用membuf将字节从文件复制到缓冲区(根据这个答案) 完整的实现如下所示 long size = getFileSize(filename); membuf sbuf(0, size); std::istream file(&sbuf); 但是,我现在确信sbuf(0,size)这0在正确的地方 所以,问题

我需要做什么

我需要从RAM中读取文件

我是怎么做的

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

然后我使用membuf将字节从文件复制到缓冲区(根据这个答案)

完整的实现如下所示

long size = getFileSize(filename);
membuf sbuf(0, size);
std::istream file(&sbuf);
但是,我现在确信
sbuf(0,size)
0
在正确的地方


所以,问题是-如何将
membuf
设置为合适的大小?

据我所知,您想阅读一个文件

您需要了解程序的每个变量都存储在ram中。所以,要“从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);
注意:此方法存在问题。首先,正如@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原始_文件(“filename.dat”);
std::istringstream文件\u来自\u ram;

你们问题的主题很混乱。@Slava为什么?我只是想知道,设置membuf是否和我一样,可以吗?因为它的意思和问题本身完全不同,如果它有什么意义的话。你用过在线翻译吗?@Slava没有,但我也不是以英语为母语的人。。。我更改了问题的标题…第一个参数是缓冲区的开始。设置为0意味着它将尝试从RAM中的零地址读取。这就是你想要的吗?在大多数操作系统上,它会导致崩溃。那么,您如何解释这个答案呢?您发送的答案是关于效率的。由于整个文件可以存储为C风格的字符指针,因此它显然比存储std::istream类占用的内存少。如果你真的想这样做,你应该看看你提供的第一个选项,实际上我已经做过了,但检查第二个选项的执行时间很有意思,这需要更多的时间。。。我希望这是由于方法对方法的每次调用都会为
std::string
分配内存,其中作为
std::vector
我在
.h
文件中进行了清除,只需调整它的大小。。。所以,第一种选择更快(正如我测试的那样)。而且我还从内存中获取了error hire
文件
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);
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